Inicio

Funciones de conversión

source("functions_hidrocarburos.R")

Variables

Producción de Crudo

Producción de Gas Natural

Produccion total

produccion_total <- prod_merge_gas_bep %>% 
  select(anio, unidad,prod_gas) %>%
  left_join(prod_merge_crudo %>% 
              select(anio, unidad,prod_crudo) %>%  mutate(unidad ="BEP") ) %>% 
  mutate(produccion_total_bep = prod_crudo + prod_gas)
Joining, by = c("anio", "unidad")
produccion_total

Precio Mercado Interno

Precio Mercado Interno de Crudo

Precio Mercado Interno de Gas Natural

Precios de Referencia del Mercado Mundial

Precios de Referencia del Crudo

Precios de Referencia del Gas

Exportación Argentina
Referencias mundiales
Bolivia
Todos los precios
precio_crudo_vs_gas <- precio_mdomundial_gas_bep %>% 
  select(anio, unidad, precio_externo_gas) %>% 
  left_join(precios_referencia_y_expo_crudo %>% 
              select(-unidad) %>% 
              gather(key = tipo_precio_crudo,
                     value   = precio_crudo_usd_bbl,
                     2:ncol(.)), by ="anio") %>% 
  mutate(precio_crudo_sobre_gas =precio_crudo_usd_bbl/precio_externo_gas) %>% 
  filter(!(is.na(precio_crudo_sobre_gas)), 
         !(tipo_precio_crudo %in% c("wti_spot_price_fred", "precio_me_crudo"))  )
         # (tipo_precio_crudo %in% c("brent_iea"))  )
         # (tipo_precio_crudo %in% c("brent_iea", "brent_historic"))  )
precio_crudo_vs_gas

# graf <-  precio_crudo_vs_gas %>% 
#   ggplot(aes(anio, precio_crudo_sobre_gas, color=tipo_precio_crudo))+
#   geom_line()+
#   labs(title = "precio del crudo sobre el del gas (ambos en barriles)")

# ggplotly(graf, width = 800, length=600)
# graf

# writexl::write_xlsx(precio_crudo_vs_gas, path= "precio del crudo vs gas.xlsx")  

Exportaciones e Importaciones

Exportaciones e Importaciones de Crudo

Exportaciones e Importaciones de Gas

Empleo, Remuneraciones y Masa Salarial (CCNN)

Activos

Pasar datos de bs de uso en yacimientos para armar relación activo yacimeinto/total

Fuentes:

  • Balances de Bolsar (unicamente empresas que cotizan en la bolsa de valores argentina). Revisar el stock del sector distribución porque se presenta demasiado grande con respecto al de los demás. Falta pasar los datos del activo de casi todas las empresas

  • AFIP. Con esta fuente no tenemos calculo de renta, sino que solo usamos la TG como parámetro. Nota: "_c" significa casos presentados de la variable correspondiente

  • Memorias de YPF. La década de los 80 presenta picos que hay que revisar

  • Calculo del Capital Total Adelantado (KTA)

    • Bolsar: Es equivalente a la suma de Propiedad, Planta y Equipos Neta (descontando los terrenos y obras en curso) y los Inventarios. Cuando los datos lo habilitan, se le agregó los salarios adelantados (salarios y cargas consumidos sobre rotación). Luego, cuando no se presentaron datos de Propiedad, Planta y Equipos, se tomó el activo no corriente.
    • AFIP: Es equivalente a la suma de Bienes de Uso, Bienes de Cambio, Inventarios y Disponibilidades.
    • Memoria YPF: Suma de Bienes de Uso y Bienes de Cambio

Stock total de la rama

Stock de segmentos de YPF y Petrobras

Stock por empresas

YPF largo plazo

Comparación entre la Memoria YPF (recopilado por BFR) y los balances extríados de Bolsar

YPF
#metros perforados
metros_perforados_posterior_al_2009 <- read_csv("../data/secretaria_energia/sesco/metros-perforados.csv", 
    col_types = cols(indice_tiempo = col_date(format = "%Y-%m")))

metros_perforados_anterior_al_2009 <- read_csv("../data/secretaria_energia/sesco/metros-perforados-anterior-al-2009.csv") %>% 
  rename(cantidad = Cantidad)
Rows: 55608 Columns: 19
-- Column specification -----------------------------------------------------------------------------------------------------------------
Delimiter: ","
chr  (12): idempresa, empresa, idareapermisoconcesion, areapermisoconcesion, idareayacimiento, areayacimiento, idcuenca, cuenca, idpr...
dbl   (5): anio, mes, idubicacion, idconcepto, Cantidad
lgl   (1): observaciones
date  (1): fecha_data

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
metros_perforados_empresa <- metros_perforados_posterior_al_2009 %>%
  bind_rows(metros_perforados_anterior_al_2009) %>% 
  select(anio, mes, idempresa, empresa, idconcepto, concepto, cantidad, observaciones ) %>% 
  group_by(anio, idempresa, empresa) %>%
  summarise(metros_perforados = sum(cantidad, na.rm = T)) %>% 
  ungroup()
`summarise()` has grouped output by 'anio', 'idempresa'. You can override using the `.groups` argument.
#listado de empresas con sus id's
listado_empresa <- distinct(metros_perforados_empresa %>% 
              select(idempresa, empresa),idempresa, .keep_all = T) 

# sec energia
# pozos cargados por empresas
listado_pozos <- read_csv("../data/secretaria_energia/cap_iv/listado-de-pozos-cargados-por-empresas-operadoras.csv") %>% 
  mutate(anio_terminacion_pozo =year(adjiv_fecha_fin_term)) %>%
  left_join(listado_empresa) %>% 
  group_by(anio_terminacion_pozo, idempresa, empresa) %>% 
  summarise(pozos = n()) %>% 
  filter(!is.na(anio_terminacion_pozo))
Rows: 79951 Columns: 51
-- Column specification -----------------------------------------------------------------------------------------------------------------
Delimiter: ","
chr  (21): sigla, formprod, idempresa, idareapermisoconcesion, idareayacimiento, idcuenca, idprovincia, codigopropio, nombrepropio, a...
dbl  (22): idpozo, coordenadax, coordenaday, cota, profundidad, pet_inicial, gas_inicial, agua_inicial, iny_agua_inicial, iny_gas_ini...
lgl   (1): unique_sigla_formprod
dttm  (2): fechadeingreso, fecha_data
date  (5): adjiv_fecha_inicio, adjiv_fecha_fin, adjiv_fecha_inicio_term, adjiv_fecha_fin_term, adjiv_fecha_abandono

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
Joining, by = "idempresa"
`summarise()` has grouped output by 'anio_terminacion_pozo', 'idempresa'. You can override using the `.groups` argument.


ppye_ypf <- ypf_seg %>% 
  filter(sector  == "upstream" ) %>% 
  mutate(anio = year(fecha)) %>% 
  left_join(ipc_promedio %>% 
              select(anio, ipc_18), by = "anio") %>% 
  mutate(variable = "activo_upstream_ypf",
         activos = activos/ipc_18,
         unidad = "Millones de pesos 2018")%>% 
  select(anio, empresa, unidad ,  activo_upstream= activos) %>% 
  left_join(stock_balances_empresas %>% 
    ungroup() %>% 
    filter(variable == "ppye" & empresa == "YPF") %>%
    select(anio, empresa, unidad, ppye_integrada =valor) , by = c("anio", "empresa", "unidad")) %>% 
  mutate(activo_upstream = variacion_interanual(activo_upstream),
         ppye_integrada = variacion_interanual(ppye_integrada)) %>% 
  full_join(listado_pozos %>%
              select(-empresa) %>% 
              ungroup() %>% 
              filter(idempresa == "YPF") %>% 
              rename(anio = anio_terminacion_pozo, empresa = idempresa), by = c("anio", "empresa") ) %>% 
  arrange(anio)
ppye_ypf

ppye_ypf_tasas <- ppye_ypf %>%
   arrange(anio) %>%
  filter(anio %in% 1998:2018) %>%
  select(-c(anio, empresa, unidad)) %>%
  mutate_all(tasa_crecimiento)

#matriz de correlacion
# cor_pozos_ypf <- cor(ppye_ypf_tasas, use = "complete.obs")
# cor_pozos_ypf

#  distintos correlogramas
#con ggcorrplot
# p.mat = cor_pmat(cor_pozos_ypf)
# ggcorrplot(cor_pozos_ypf, hc.order = TRUE,
#     type = "lower", p.mat = p.mat, lab = T)

# GGally::ggpairs(ppye_ypf_tasas, lower = list(continuous = "smooth"))
# plot(ppye_ypf_tasas)
#años bases
anio_base_ypf_segmento <-   ppye_ypf$activo_upstream[ppye_ypf$anio == 2006]

anio_base_ypf_bolsar <- ppye_ypf$ppye_integrada[ppye_ypf$anio == 2006]


stock_y_pozos_ypf <-  ppye_ypf %>% 
  mutate(indice_pozos_06 = generar_indice(serie= pozos ,
                                        fecha = anio,
                                        fecha_base = 2006)) %>% 
  mutate(ppye_ypf_estimado = anio_base_ypf_bolsar * indice_pozos_06,
         activo_ypf_estimado =anio_base_ypf_segmento * indice_pozos_06,
         unidad_ppye="Millones de pesos 2018")

# stock_y_pozos_ypf %>%
#            select(anio, unidad = unidad_ppye, ppye_ypf_estimado, activo_ypf_estimado) %>%
#            gather(key = estimacion,
#                    value = valor, 
#                    3:4) %>% 
#            filter(anio >1960) %>% 
#   ggplot(aes(anio,valor , color = estimacion))+
#   geom_line()+
#   labs(y= "Millones de pesos de 2018", title = "Estimacion de Activo usptream y PPyE de YPF a partir de indice de pozos")
PPyE y activo upstream total rama a partir de YPF
pozos_yfp_sobre_total <- listado_pozos %>%
  rename(anio = anio_terminacion_pozo) %>% 
  group_by(anio) %>% 
  summarise(pozos_cargados_sec_energia = sum(pozos, na.rm = T)) %>% 
  left_join(listado_pozos %>%
              rename(anio = anio_terminacion_pozo) %>% 
              filter(idempresa == "YPF") %>% 
              group_by(anio, idempresa) %>% 
              summarise(pozos_cargados_ypf = sum(pozos, na.rm = T))) %>% 
  mutate(ypf_sobre_total = pozos_cargados_ypf/pozos_cargados_sec_energia)
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = "anio"
# pozos_yfp_sobre_total

estimacion_ppye_total_via_ypf <- stock_y_pozos_ypf %>% 
  select(anio, unidad = unidad_ppye, ppye_ypf_estimado, activo_ypf_estimado) %>% 
  gather(key = estimacion,
         value = valor, 
         3:4) %>% 
  left_join(pozos_yfp_sobre_total %>% 
              select(anio, ypf_sobre_total)) %>% 
  mutate(valor = valor/ypf_sobre_total,
          estimacion = case_when(estimacion == "ppye_ypf_estimado" ~ "ppye_estimado_total",
                                 estimacion == "activo_ypf_estimado" ~ "activo_estimado_upstream" ))
Joining, by = "anio"
  
# estimacion_ppye_total_via_ypf %>%
#            filter(anio >1960) %>% 
#   ggplot(aes(anio,valor , color = estimacion))+
#   geom_line()+
#   labs(y= "Millones de pesos de 2018", 
#        title = "Estimacion de Activo usptream y PPyE total a partir de ampliación de pozos YPF")

Regalías

  • Fuentes:
    • Secretaría de Energía (Base Regalías)

Subsidios

# CEFIP cont et al. Subsidios como % del PBI
subsidios_cefip <- read_excel("../data/cefip/subsidios.xlsx") %>% 
  gather(key = anio,
         value = subsidios_porcentaje_pbi,
         2:ncol(.)) %>% 
  filter(sector %in% c( "Plan Gas",
                       # "ENARSA","CAMMESA", 
                       "Subsidios FF GN y GLP")) %>% 
  mutate(anio = as.double(anio)) %>% 
  left_join(ganancia_y_pbi %>% 
              select(anio, pbi)) %>%
  mutate(subsidios_porcentaje_pbi=as.double(subsidios_porcentaje_pbi),
         subsidios_cefip = subsidios_porcentaje_pbi/100 * pbi * 10^6) %>% 
  group_by(anio) %>% 
  summarise(unidad = "Pesos corrientes",
            subsidios_cefip=sum(subsidios_cefip, na.rm = T))
Joining, by = "anio"
NAs introducidos por coerci昼㸳n
#ejes 
subsidios_ejes <- read_excel("../data/ejes/subsidios.xlsx" ) %>% 
  rename(subsidios_usd = subsidios_hidrocarburos) %>% 
  right_join(tcp_anual_b %>% 
               select(anio, tcc), by = "anio") %>%
  group_by(anio) %>% 
  summarise(unidad = "Pesos corrientes",
         subsidios_ejes = subsidios_usd*tcc*10^6)

subsidios_hidrocarburos <- subsidios_ejes%>% 
  select(anio, unidad, subsidios_ejes) %>% 
  full_join(subsidios_cefip, by =c("anio", "unidad")) %>% 
  arrange(-anio) %>% 
  mutate(unidad = "Pesos corrientes")
         # x = subsidios_cefip/subsidios_ejes)
subsidios_hidrocarburos  

Valor total de la producción

Estimaciones propias

Tasa de Ganancia

\[TG_{hidrocarburos} = \frac{PV_{hidrocarburífera}}{KTA_{hidrocarburífero}}\]

##Total rama

Renta apropiada por las empresas de la rama

La renta apropiada por las empresas de la rama se calcula por medio del diferencial de tasas de ganancia entre el sector hidrocarburífero que surge a partir de los balances y la rentabilidad normal de la economía.

\[Renta\_empresas = KTA_{hidrocarburífero} * (TG_{hidrocarburífera} - TG_{referencia})\] \[TG_{hidrocarburífera} = \frac{Gcia_{hidrocarburos}}{KTA_{hidrocarburífero}}\] Por lo cual, la renta apropiada por las empresas de la rama sería equivalente a:

\[Renta\_empresas = Gcia_{hidrocarburos} - KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburífero}\) = Stock de capital adelantado de empresas hidrocarburíferas
  • \(TG_{hidrocarburífera}\) = Tasa de ganancia de empresas hidrocarburíferas
  • \(TG_{referencia}\) = Tasa de ganancia de referencia
  • \(Gcia_{hidrocarburos}\) = Ganancia de empresas hidrocarburíferas
Joining, by = "anio"

Renta por el diferencial de precios entre el mercado interno y las referencias internacionales

Renta apropiada mediante el abaratamiento en el consumo interno por efecto del diferencial de precios interno/externo, sobrevaluación de la moneda y retenciones a la exportación

Criterio de cómputo de JK (variable ‘renta_dif_precios’)

\[RDP= ProdInt * Pext * TCP - ProdInt * PMI * TCC\]

Donde:

  • \(RDP\) = Renta apropiada por efecto diferencial de precios interno/externo y sobrevaluación
  • \(MdoInt\) = Producción destinada al Mercado Interno: Producción - Exportaciones - Existencias (barriles de petróleo ó MMBTU)
  • \(Pext\) = Precio de referencia del mercado externo (USD)
  • \(PMI\) = Precio de venta del mercado interno (USD)
  • \(TCP\) = Tipo de Cambio de Paridad
  • \(TCC\) = Tipo de Cambio Comercial

Criterio de cómputo de JIC y cia (variable ‘renta_abaratamiento_sobrevaluacion’)

\[RDP = MdoInt * PMI * (\frac{TCP}{TCC} - 1)\]

Renta apropiada por sobrevaluación cambiaria

\[Rsobrevaluacion = Expo * Pext * (TCP - TCC)\]

Donde: * \(Rsobrevaluacion\) = Renta apropiada por exportaciones con tipo de cambio sobrevaluado * \(Expo\) = Exportaciones (barriles de petróleo ó MMBTU) * \(Pext\) = Precio de referencia del mercado externo (USD) * \(TCP\) = Tipo de Cambio de Paridad * \(TCC\) = Tipo de Cambio Comercial

Joining, by = "anio"

Renta apropiada por el Estado mediante impuestos específicos

Joining, by = "anio"
Joining, by = c("anio", "unidad")
Joining, by = c("anio", "unidad")

\[Rimp = RE + Reg\]

Donde:

  • \(Rimp\) = Renta apropiada por el Estado mediante impuestos específicos
  • \(RE\) = Retenciones
  • \(Reg\) = Regalias

Renta apropiada por consumidores y refinerías y procesadoras

Criterio de cómputo de Ramón (2019)

Refinerías y procesadoras

\[RR = (PI - PRMi) * CrudoP\]

  • \(RR\) = Renta apropiada por las Refinadoras
  • \(PI\) = promedio ponderado de Precios Internacionales
  • \(PRMi\) = Precio ponderado a Refinerías del Mercado Interno
  • \(CrudoP\) = barriles de Crudo Procesado por las refinadoras

Consumidores

\[RC = (PI - PRMi - MR) * CrudoP \]

  • \(RC\) = Renta apropiada por los Consumidores
  • \(MR\) = Margen de Refinerías

Esto resulta equivalente a plantear:

\[RC = PCMi * CrudoP\]

  • \(PCMi\) = Precio ponderado a Consumidores del Mercado Interno.

Combustibles

Renta Hidrocarburífera Total. En precios constantes, sobre Plusvalía Total y PBI

Existen dos caminos para llegar al monto total de renta de la tierra hidrocarburífera: uno es descontando la ganancia normal de las empresas a la plusvalía total del sector y el otro es por medio de la suma de mecanismos de apropiación.

\[Renta\_hidrocarburífera = PV_{hidrocarburífera} - Gcia\_Normal_{hidrocarburífera}\] Donde:

  • \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia Normal del sector hidrocarburífero
  • \(PV_{hidrocarburífera}\) = Plusvalía del sector hidrocarburífero

\[Gcia\_Normal_{hidrocarburífera} = KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburos}\) = Stock de capital adelantado del sector hidrocarburífero
  • \(TG_{referencia}\) = Tasa de ganancia normal de referencia.

En este caso, seleccionamos la tasa de ganancia del sector industrial como parámetro para diferenciar la renta de la ganancia. A su vez, para el capital total adelantado de las empresas hidrocarburíferas, seleccionamos unicamente el valor resultante de la estimación de la PPyE de Bolsar a partir del indice de flujo de pozos (variable “ppye_bolsar_flujo”), por lo que le faltan los inventarios y salarios adelantados.

El cálculo de renta total hidrocarburífera que se obtiene por medio de descontar la ganancia normal a la plusvalía total del sector, debe ser igual a la renta obtenida por medio de la agregación de los distintos mecanismos de apropiación. Es decir:

\[Renta\_hidrocarburífera = Renta\_diferencial\_precios + Renta\_sobrevaluación + Renta\_empresas + Impuestos\_netos\_específicos \] \[Impuestos\_netos\_específicos = Retenciones + Regalías - Subsidios\]

Método directo (a partir de descuentos sobre el VBP)

Método indirecto (suma de mecanismos)

#################### solo gas
# Gas
# renta_gas_pbi_pv <- renta_diferencial_precios_gas %>% 
#   select(anio,renta_diferencial_precios_gas, renta_abaratamiento_sobrevaluacion_gas ) %>% 
#   group_by(anio ) %>% 
#   mutate_all(function(x) {x / 10^6}) %>% 
#   left_join(ganancia_y_pbi) %>% 
#   mutate(renta_dif_precios_gas_pv = renta_dif_precios_gas/ganancia,
#          renta_dif_precios_gas_pbi = renta_dif_precios_gas/pbi,
#          renta_abaratamiento_sobrevaluacion_gas_pv = renta_abaratamiento_sobrevaluacion_gas/ganancia,
#          renta_abaratamiento_sobrevaluacion_gas_pbi = renta_abaratamiento_sobrevaluacion_gas/pbi,
#          unidad = "Millones de Pesos corrientes")
# 
# graf_renta_gas_pv <- renta_gas_pbi_pv %>% 
#   select(anio, 7:ncol(.) ) %>% 
#   gather(key = tipo_renta,
#          value = valor,
#          2:ncol(.)) %>% 
#   ggplot(aes(anio, valor, color = tipo_renta, fill = tipo_renta))+
#   geom_col(position = "dodge")+
#   theme(legend.position = "bottom")+
#   labs(title = "Renta petrolera por diferencial de precios interno y externo sobre PBI y Ganancias Totales",
#        y = "%")
# plotly::ggplotly(graf_renta_gas_pv)

Costos

\[Q\_total = Q_{petróleo} + Q_{gas} \] Donde:

  • \(Q\_total\) = Cantidades producidas de petróleo y gas en Barriles Equivalentes de Petróleo
  • \(Q_{petróleo}\) = Cantidades producidas de petróleo crudo en barriles equivalentes de petróleo (BOE)
  • \(Q_{gas}\) = Cantidades producidas de gas natural en barriles equivalentes de petróleo (BOE)

\[ Costos\_totales = CI + MS + ConKfijo\]

Donde:

  • \(Costos\_totales\) = Costos totales hidrocarburíferos
  • \(CI\) = Consumo Intermedio, distintas estimaciones
  • \(MS\) = Masa Salarial, distintas estimaciones
  • \(ConKfijo\) = Consumo de Capital Fijo

\[Costos\_totales\_con\_Gcia = Costos\_totales + Gcia\_Normal_{hidrocarburífera} \] Donde:

  • \(Costos\_totales\_con\_Gcia\) = Costos totales hidrocarburíferos con ganancia normal
  • \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia normal del sector hidrocarburífero

\[ Precio\_costo = \frac{Costos\_totales}{Q\_total} \] Donde: * \(Precio\_costo\) = Precio de costo en BOE

A partir de esto se puede calcular un costo recuperable del petróleo y del gas

\[Costo\_crudo = Q_{petróleo} * Precio\_costo\] \[Costo\_gas = Q_{gas} * Precio\_costo\]

\[Precio\_produccion = \frac{Costos\_totales\_con\_Gcia}{Q\_total}\]

\[Precio\_vta\_potencial = \frac{Q\_total*Pext_{petróleo} - Costos\_totales}{Q\_total} \]

Donde: * \(Precio\_produccion\)= Precio de produccion * \(Precio_vta_potencial\) = Precio de venta potencial * \(Pext_{petróleo}\) = Precio de exportación/referencia internacional del petróleo crudo

#estimacion costos propia
costos <- produccion_total %>% 
  select(anio, unidad_produccion=unidad,
         produccion_crudo =prod_crudo, produccion_gas=prod_gas,
         produccion_total=produccion_total_bep) %>% 
 left_join(stock_estimado %>%
               left_join(ipc_promedio %>% select(anio, ipc_18)) %>%
              # filter(variable == "ppye_estimado_bolsar") %>% 
              mutate(consumo_k_fijo = valor * ipc_18 * consumo_k_fijo_ypf) %>% 
               select(anio, consumo_k_fijo)) %>%
  left_join(valor_total_produccion %>% 
              left_join(ipc_promedio %>% select(anio, ipc_18)) %>% 
              left_join(tcp_anual_b %>% select(-sobrevaluacion)) %>%
              filter(variable %in% c("ci_extr", "ms_extr"),
                     fuente%in% c("CCNN oficial", "Empalme CCNN")) %>% #"Criterio CCNN"
              mutate(valor = (valor*10^6)*ipc_18/tcc,
                     unidad ="USD tcc") %>% 
              spread(key=variable, value=valor)) %>% 
  left_join(renta_directo %>% 
              select(anio, #stock_seleccionado,
                     ppye, tg_normal, renta_total) ) %>% 
  left_join(precios_referencia_y_expo_crudo %>% 
              select(anio, unidad, precio_referencia_externo = precio_me_crudo)) %>% 
  mutate(ppye = (ppye*10^6)*ipc_18/tcc,
         renta_total = (renta_total*10^6)*ipc_18/tcc,
         unidad_costos= "USD/boe",
         costos_totales = (ci_extr +ms_extr + consumo_k_fijo),
         costos_totales_sum_gcia_normal = costos_totales + (ppye  * tg_normal),
         precio_costo = costos_totales/produccion_total,
         precio_costo_mmbtu = conversor_bepMMBTU_p(precio_costo),
         precio_produccion =costos_totales_sum_gcia_normal/produccion_total,
         precio_venta_potencial = (produccion_total *precio_referencia_externo -
                                     costos_totales)/produccion_total )
Joining, by = "anio"
Joining, by = "anio"
Joining, by = c("anio", "ipc_18")
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = c("anio", "unidad")
         # precio_venta_potencial = ((ppye * tg_normal)+renta_total)/produccion_total)
# (produccion x precio internacional - costos_totales) / barriles BOE = gcia + renta por barril 
#expresar en usd tcc y tcp
costos

# costos %>% 
#            filter(anio > 1997) %>% 
#   ggplot(aes(anio, precio_costo, color = fuente))+ 
#   geom_line(alpha = 0.5, size = 1.4)+
#     labs(title = "Precio de costo",
#          subtitle= "Estimacion propia a partir de CCNN y reestimacion de VBP con criterio CCNN", 
#          y = "USD/BOE", x = "Año")

Comparación con estimación de otros autores

Exportacion de resultados

#raw data for metadata
datos <-  list( prod_merge_crudo, precio_mi_crudo, expo_q_crudo, precios_referencia_y_expo_crudo, prod_merge_gas_MMBTU, 
   precio_interno_gas_mmbtu_usd,  expo_q_gas,  precio_mdomundial_gas_MMBTU, subsidios_hidrocarburos,
   ganancia_y_pbi, tcp_anual_b, ipc_promedio , renta_indirecto[,c(1:13, 17)], renta_dif_precios_crudo[,-14], 
 renta_diferencial_precios_gas[,-13], renta_tcp_crudo[,-c(12:13)], renta_tcp_gas, regalias_usd, retenciones_crudo, subsidios_hidrocarburos, 
 renta_produccion_balances , criterio_propio, renta_directo, renta_directo_pbi[,c(1,14:15)], 
 renta_indirecto[,c(1,19:20)],  ccnn_oficial, criterio_ccnn, empalme_ccnn, criterio_propio, 
renta_comparacion, renta_empresas_balances,  stock_balances_empresas, union_segmentos, costos)

## variables de todos los dataframes
columnas <- c()
for(i in 1:length(datos)){
  columnas <- c(columnas, colnames(datos[[i]]))
}

list_col <-  as.data.frame(unique(columnas))


# x <- readxl::read_excel("columnas.xlsx") %>% 
#   # rename(variable = "unique(columnas)") %>% 
#   mutate(unidad = case_when(str_detect(variable, regex("gas|bolivia"))  & str_detect(variable, regex("precio|price")) ~ "USD/MMBTU",
#                             str_detect(variable, regex("gas|lng"))  & str_detect(variable, regex("prod")) ~ "MMBTU",
#                             str_detect(variable, regex("crudo|petroleo"))  & str_detect(variable, regex("precio")) ~ "USD/Barril",
#                             str_detect(variable, regex("crudo|petroleo")) ~ "Barriles",
#                             str_detect(variable, regex("crudo|petroleo"))  & str_detect(variable, regex("prod|expo")) ~ "Barriles"))
#                             

# writexl::write_xlsx(x, path =  "columnas.xlsx")

t1 <- Sys.time()
delta  <- as.numeric(  t1 - t0, units = "secs")  #calculo la diferencia de tiempos
print( delta) 
[1] 57.99892
 
#concatenacion de all data
all_raw_data = rbindlist(list(prod_merge_crudo ,prod_merge_gas_MMBTU, 
               expo_q_crudo , expo_q_gas_MMBTU,
               precio_mi_crudo, precio_interno_gas_mmbtu_usd, 
               precios_referencia_crudo, precios_exportacion_crudo, 
               precios_referencia_gas, precios_exportacion_gas,
               regalias_to_vars, retenciones_pg, subsidios_pg),  use.names=TRUE)
LS0tDQp0aXRsZTogIlByZXByb2Nlc2FtaWVudG8gZGUgZGF0b3MiDQphdXRob3I6DQotIGFmZmlsaWF0aW9uOiBVTkdTL0NPTklDRVQNCiAgbmFtZTogTWF0ZW8gU3VzdGVyIHkgSnVhbiBLb3JuYmxpaHR0DQpvdXRwdXQ6DQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICBrZWVwX3RleDogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KPGJyPg0KPGJyPg0KDQo8Y2VudGVyPiA8aDE+PC9oMT4gPC9jZW50ZXI+IA0KDQojIEluaWNpbw0KICANCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIGxpYnJhcnkoeHRhYmxlKSAjIGVqIHh0YWJsZSh0YWJsYSkgcGFyYSBwYXNhciBhIGxhdGV4DQpzZXR3ZCgiQzovQXJjaGl2b3MvcmVwb3MvaGlkcm9jYXJidXJvcy9hbmFsaXNpcy9jb2RpZ29zIikNCnQwICA8LSBTeXMudGltZSgpDQoNCiMga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCg0KbGlicmFyeShyZWFkeGwpIA0KIyBsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZnMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoaHV4dGFibGUpICNyZXZpc2FyIGVzdG8gcGFyYSBkYXIgZm9ybWF0byBhbCBlamUgWQ0KIyBsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkoem9vKQ0KDQpvcHRpb25zKHNjaXBlbiA9IDk5OTk5OTkpDQoNCmBgYA0KDQpGdW5jaW9uZXMgZGUgY29udmVyc2nDs24gDQoNCiogW0NhbmFkYSDigJMgTmF0aW9uYWwgRW5lcmd5IEJvYXJkLiBFbmVyZ3kgQ29udmVyc2lvbiBUYWJsZXNdKGh0dHBzOi8vYXBwcy5jZXItcmVjLmdjLmNhL0NvbnZlcnNpb24vY29udmVyc2lvbi10YWJsZXMuYXNweD9Hb0NUZW1wbGF0ZUN1bHR1cmU9ZW4tQ0EjMi0zKQ0KKiBbQlBdKGh0dHBzOi8vd3d3LmJwLmNvbS9jb250ZW50L2RhbS9icC9idXNpbmVzcy1zaXRlcy9lbi9nbG9iYWwvY29ycG9yYXRlL3BkZnMvZW5lcmd5LWVjb25vbWljcy9zdGF0aXN0aWNhbC1yZXZpZXcvYnAtc3RhdHMtcmV2aWV3LTIwMTktYXBwcm94aW1hdGUtY29udmVyc2lvbi1mYWN0b3JzLnBkZikNCiogW0VJQV0oaHR0cHM6Ly93d3cuZWlhLmdvdi9raWRzL3doYXQtaXMtZW5lcmd5L2VuZXJneS1jYWxjdWxhdG9ycy5waHAjbmF0Z2FzY2FsYykNCg0KYGBge3J9DQpzb3VyY2UoImZ1bmN0aW9uc19oaWRyb2NhcmJ1cm9zLlIiKQ0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIERhdG9zIEF1eGlsaWFyZXMNCiMgVGFibGEgcGFyYSBjb252ZXJ0aXIgbG9zIGNhbWJpb3MgZGUgbW9uZWRhDQpjb252ZXJzb3JfcGVzb3MgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9jb252ZXJzb3Jlcy9jb252ZXJzb3JfcGVzby54bHN4IikgJT4lIA0KICAjIG11dGF0ZSgibSRuIiA9IGFzLmRvdWJsZShjb252ZXJzb3JfcGVzb3MkYG0kbmApKSAlPiUgDQogIG11dGF0ZV9hbGwoLiwgYXMuZG91YmxlKSAlPiUgDQogIG11dGF0ZShtb25lZGEgPSBjKCJtb25lZGEgbmFjaW9uYWwiLCAicGVzb3MgbGV5IiwgInBlc28gYXJnZW50aW5vIiwgImF1c3RyYWwiLCAicGVzb3MiKSkgJT4lIA0KICBmaWx0ZXIobW9uZWRhID09ICJwZXNvcyIpDQoNCiMjIyBUQ1AgDQp0Y3BfYW51YWwgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS90Y3AvdGNwX2FudWFsLnhsc3giLCANCiAgICBjb2xfdHlwZXMgPSBjKCJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpKSAlPiUgDQogIHJlbmFtZShhbmlvID0gZmVjaGEpDQoNCnRjcF9hbnVhbF9iIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvdGNwL3RjY190Y3BfaGlzdG9yaWNvLnhsc3giKSAlPiUgDQogIHJlbmFtZSh0Y2MgPSAgYFRDQyBleHBvcnRhY2lvbmVzYCwgc29icmV2YWx1YWNpb24gPSBgU29icmV2YWx1YWNpw7NuIChUQ1AvIFRDQykgMTk1Mi0xOTcyPTFgLA0KICAgICAgICAgdGNwID0gIlRDUCIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBjYXNlX3doZW4oYW5pbyA9PSA0MzMxMyB+IDIwMTgsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBhbmlvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdGNjLCB0Y3AsIHNvYnJldmFsdWFjaW9uKQ0KDQoNCnRjY19kaWNfNjMgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS90Y3AvdGNjX2RpY182My54bHN4IikNCg0KdGNjX21vbmVkYV9vcmlnaW5hbCA8LSAgdGNjX2RpY182MyAlPiUgDQogIHNlbGVjdCgtdXNkX2RpYykgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MgKSkgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gY2FzZV93aGVuKGFuaW8gPT0gMTk4NCB+ICIkYXJnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gbW9uZWRhKSwNCiAgICAgICAgICB0Y2NfbW9uZWRhID0gY2FzZV93aGVuKCAjaG9tb2dlbml6YW1vcyBsb3MgY2FtYmlvcyBkZSBtb25lZGENCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICJtJG4iIH4gdGNjKmNvbnZlcnNvcl9wZXNvcyRgbSRuYCAsDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiJGxleSIgfiB0Y2MqY29udmVyc29yX3Blc29zJGAkTGV5YCwgDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiJGFyZyIgfiB0Y2MqY29udmVyc29yX3Blc29zJGAkYWAsIA0KICAgICAgICAgICAgICAgICBtb25lZGEgPT0gIkEiIH4gdGNjKmNvbnZlcnNvcl9wZXNvcyRBLA0KICAgICAgICAgICAgICAgICBUIH4gdGNjKSApDQp0Y2NfbW9uZWRhX29yaWdpbmFsICANCg0KDQojIyBJUEMNCmlwYyA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL2luZGljZXMvaXBjX21lbnN1YWxfMTk2M18yMDE4Lnhsc3giKSAlPiUgDQogIG11dGF0ZShhbmlvID0gem9vOjpuYS5sb2NmKGFuaW8pKSAlPiUgDQogIHJlbmFtZShpcGNfMDcwMyA9IGBCYXNlIDcvMjAwMyA9IDFgKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlKGFuaW8sIG1lcywgc2VwID0gIi0iKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgYW5pbywgbWVzICwgZXZlcnl0aGluZyguKSkNCg0KI2VzdGUgZXN0w6EgbWFsICANCiMgaXBjX3ZhcmlhY2lvbiA8LSAgaXBjICAlPiUgDQojICAgZmlsdGVyKG1lcyA9PSAxKSAlPiUgDQojICAgbXV0YXRlKGlwY192YXIgPSBjYW1iaW9fcG9yY2VudHVhbChpcGNfMDcwMyksDQojICAgICAgICAgIGlwY192YXI9IGNhc2Vfd2hlbihpcy5uYShpcGNfdmFyKSB+IDEsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gaXBjX3ZhciksDQojICAgICAgICAgICBpcGNfMDE2MiA9IGNhc2Vfd2hlbihhbmlvID09IDE5NjIgfiAxKSwNCiMgICAgICAgICAgaXBjXzAxNjIgPSBsYWcoaXBjXzAxNjIpK2xhZyhpcGNfMDE2MikqIGlwY192YXIpDQojICAgICAgICAgIA0KICAgICAgICAgIyBpcGNfMDE2MiA9IGxhZyhpcGNfMDE2MikgKyAobGFnKGlwY18wMTYyKSogaXBjX3ZhcikpDQogICAgICAgICAjIGlwY18wMTYyID0gY2FzZV93aGVuKCBpcy5uYShpcGNfMDE2MikgfiBsYWcoaXBjXzAxNjIpICsgbGFnKGlwY18wMTYyKSppcGNfdmFyICkpDQoNCg0KaXBjX3Byb21lZGlvIDwtIGlwYyAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoaXBjXzAzID0gbWVhbihpcGNfMDcwMykpICU+JSANCiAgbXV0YXRlKGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUoYW5pbyAsIG9yZGVycyA9ICJ5IikpLCANCiAgICAgICAgIGlwY183MCA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0gaXBjXzAzLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGE9IGZlY2hhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gIjE5NzAtMDEtMDEiKSwNCiAgICAgICAgIGlwY18xOCA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0gaXBjXzAzLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGE9IGZlY2hhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gIjIwMTgtMDEtMDEiKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGV2ZXJ5dGhpbmcoLikpDQoNCiMgaXBjXzcwIDwtIGlwY192YXJpYWNpb24gJT4lIA0KIyAgIHNlbGVjdChmZWNoYSwgaXBjXzAxNzApICU+JSANCiMgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSANCiMgICAgICAgICAgICAgICBzZWxlY3QoZmVjaGEsIGlwY183MCkpDQoNCiMgSVBJTSBiYXNlIDE5OTMgPSAxMDANCiMgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGFsIHBvciBtYXlvciAoSVBJTSkNCiMgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGLDoXNpY29zIGFsIHBvciBtYXlvciAoSVBJQikNCiMgw41uZGljZSBkZSBwcmVjaW9zIGLDoXNpY29zIGRlbCBwcm9kdWN0b3IgKElQUCkNCnNpcG1fc2VyaWU1Nl85NSA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL2luZGVjL3NpcG0tc2VyaWU1Ni05NS54bHMiLA0KICAgIHNraXAgPSA2KSAlPiUgDQogIHJlbmFtZShhbmlvID0gbWVzLA0KICAgICAgICAgaXBpbV9uaXZlbF9ncmFsID0gZ2VuZXJhbC4uLjIgLA0KICAgICAgICAgaXBpbV9uaXZlbF9uYWMgPSBuYWNpb25hbGVzLi4uMywNCiAgICAgICAgIGlwaW1fbml2ZWxfaW1wbyA9IEltcG9ydGFkb3MsDQogICAgICAgICBpcGliX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uNSAsDQogICAgICAgICBpcGliX25pdmVsX25hYyA9IG5hY2lvbmFsZXMuLi42LA0KICAgICAgICAgaXBpYl9uaXZlbF9pbXBvID0gaW1wb3J0YWRvcywNCiAgICAgICAgIGlwcF9uaXZlbF9ncmFsID0gZ2VuZXJhbC4uLjgpICU+JSANCiAgZmlsdGVyKGdyZXBsKCAiMTkiLCBhbmlvKSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkNCg0KaXBpbV9iYXNlOTQgPC0gc2lwbV9zZXJpZTU2Xzk1ICU+JSBtdXRhdGUoaXBpbV9uaXZlbF9ncmFsXzk0ID0gZ2VuZXJhcl9pbmRpY2UoaXBpbV9uaXZlbF9ncmFsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAxOTk0KSkgJT4lIA0KICBzZWxlY3QoYW5pbywgaXBpbV9uaXZlbF9ncmFsLCBpcGltX25pdmVsX2dyYWxfOTQpDQoNCiMgR2FuYW5jaWEgeSBwYmkgcGVzb3MgY29ycmllbnRlcyAoZnVlbnRlOiBKSUMvRU0gY29udGludWFjaW9uIEpJQykNCmdhbmFuY2lhX3lfcGJpIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvY2Nubi9nYW5hbmNpYSB5IHBiaS54bHN4IikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQoNCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIEVzdGltYWNpb24gZGUgb3Ryb3MgYXV0b3Jlcw0KIyAqKkVzdGltYWNpw7NuIEpLKioNCnJlbnRhX2hpZHJvY2FyYnVyb3NfamsgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9vdHJvcyBhdXRvcmVzL3JlbnRhX2hpZHJvY2FyYnVyb3NfamsueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgZmlsdGVyKGluZGljZV90aWVtcG8gPD0gMjAxOSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICByZW5hbWUocHJlY2lvX21lX2dhcyA9IGBHYXMgbmF0dXJhbCBtZXJjYWRvIGV4dGVybm9gLA0KICAgICAgICAgcHJlY2lvX21pX2dhcyA9IGBwcmVjaW8gaW50ZXJubyBnYXMgbmF0dXJhbF9wZXNvc2AsDQogICAgICAgICBwcmVjaW9fbWVfY3J1ZG8gPSBgUHJlY2lvIGNydWRvIG1lcmNhZG8gZXh0ZXJub2AsDQogICAgICAgICBwcmVjaW9fbWlfY3J1ZG8gPSBgUHJlY2lvIGNydWRvIG1lcmNhZG8gaW50ZXJub2AsDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfdXNkID0gYEdhcyBOYXR1cmFsLiBQcmVjaW8gVmVudGEgQm9saXZpYSBhIEFyZ2VudGluYS4uLjI0YCwgDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfcGVzb3MgPSBgR2FzIE5hdHVyYWwuIFByZWNpbyBWZW50YSBCb2xpdmlhIGEgQXJnZW50aW5hLi4uMjVgLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvID1gUmVudGEgcG9yIHZlbnRhIGNydWRvIGVuIGVsIG1lcmNhZG8gaW50ZXJubyBwb3IgZGViYWpvIC8gYXJyaWJhIHByZWNpbyBpbnRlcm5hY2lvbmFsYCwNCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19nYXMgPSAnUmVudGEgcG9yIHZlbnRhIGdhcyBlbiBlbCBtZXJjYWRvIGludGVybm8gcG9yIGRlYmFqbyAvIGFycmliYSBwcmVjaW8gaW50ZXJuYWNpb25hbCcsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyA9ICdSZW50YSBjcnVkbyBwb3IgZXhwb3J0YWNpb25lcyBhIHBlc28gc29icmV2YWx1YWRvJywNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyA9ICdSZW50YSBnYXMgcG9yIGV4cG9ydGFjaW9uZXMnLA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPSAiUmV0ZW5jaW9uZXMiLA0KICAgICAgICAgcmVnYWxpYXMgPSBgUmVnYWxpYXMgdG90YWxgLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAnU1VNQSByZW50YSBvdHJvcyAoc2luIGltcG9ydGFjaW9uZXMgbmkgcmV0ZW5jaW9uZXMpJykgJT4lIA0KICBtdXRhdGUodW5pZGFkX2dhcyA9ICJNTUJUVSIsDQogICAgICAgICB1bmlkYWRfY3J1ZG8gPSAiQmFycmlsZXMiLA0KICAgICAgICAgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvID0gaW5kaWNlX3RpZW1wbywgdW5pZGFkX2dhcywgdW5pZGFkX2NydWRvLCB1bmlkYWRfcmVudGEsDQogICAgICAgICBwcm9kX3BldGNydSwgZXhwb19jcnVkbywgY3J1ZG9faW50ZXJubywNCiAgICAgICAgIHByb2RfZ2FzbmF0LCBleHBvX2dhcywgZ2FzX2ludGVybm8sDQogICAgICAgICBwcmVjaW9fbWVfZ2FzICwgcHJlY2lvX21pX2dhcyAsIHByZWNpb19tZV9jcnVkbywgcHJlY2lvX21pX2NydWRvLCANCiAgICAgICAgIHByZWNpb19ib2xpdmlhX2dhc191c2QgLCAgcHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zICwgDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fY3J1ZG8gLCByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fZ2FzICwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICwgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICwNCiAgICAgICAgIHJldGVuY2lvbmVzLCByZWdhbGlhcywgDQogICAgICAgICBUQ0MsIFRDUCwgDQogICAgICAgICByZW50YV90b3RhbCkgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByb2RfcGV0Y3J1IiwgImV4cG9fY3J1ZG8iLCAiY3J1ZG9faW50ZXJubyIpLCANCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3EpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX21pX2NydWRvIiwgInByZWNpb19tZV9jcnVkbyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNiYmxfcCkgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcm9kX2dhc25hdCIsICJleHBvX2dhcyIsICJnYXNfaW50ZXJubyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9xKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9nYXMiLCAicHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zIiksDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM01NQlRVX3ApDQoNCiAgDQpyZW50YV9wcmVjaW9fZXhwb19jcnVkb19qayA8LSByZW50YV9oaWRyb2NhcmJ1cm9zX2prICU+JSANCiAgc2VsZWN0KGFuaW8sIHByb2RfcGV0Y3J1LCBleHBvX2NydWRvLCBjcnVkb19pbnRlcm5vLCANCiAgICAgICAgIHByZWNpb19taV9jcnVkbywgcHJlY2lvX21lX2NydWRvLCBUQ0MsIFRDUCwgDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fY3J1ZG8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICkNCg0KDQpyZW50YV9wcmVjaW9fZXhwb19nYXNfamsgPC0gcmVudGFfaGlkcm9jYXJidXJvc19qayAlPiUgDQogIHNlbGVjdChhbmlvLCBwcm9kX2dhc25hdCwgZXhwb19nYXMsIGdhc19pbnRlcm5vLCANCiAgICAgICAgIHByZWNpb19taV9nYXMsIHByZWNpb19ib2xpdmlhX2dhc19wZXNvcywgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2dhcywgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICkNCg0KDQojRXN0aW1hY2nDs24gQmlsbCB5IEZhcmZhcm8gUnVpeg0KcmVudGFfaGlkcm9jYXJidXJvc19mciA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL290cm9zIGF1dG9yZXMvcmVudGFfaGlkcm9jYXJidXJvc19GUi54bHN4IiApICU+JQ0KICBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSAiUmVnYWzDrWFzIiwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gUmV0ZW5jaW9uZXMsDQogICAgICAgICBleHBvX3RjID0gIk1lZGlhbnRlIHNvYnJldmFsdWFjacOzbiBwYXJhIGV4cG9ydCIsDQogICAgICAgICBkaWZfcHJlY2lvcyA9ICJNZWRpYW50ZSBkaWZlcmVuY2lhIHByZWNpbyBpbnRlcm5vIGNvbiBpbnRlcm5hYyIpICU+JQ0KICBncm91cF9ieShhbmlvICwgaXBjXzA4KSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF4zfSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogIG11dGF0ZShyZWdhbGlhcyA9cmVnYWxpYXMgKiBpcGNfMDggL2lwY18xOCwNCiAgICAgICAgIHJldGVuY2lvbmVzID1yZXRlbmNpb25lcyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgZXhwb190YyA9ZXhwb190YyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgZGlmX3ByZWNpb3MgPWRpZl9wcmVjaW9zICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICByZW50YV90b3RhbCA9IHJlZ2FsaWFzKyByZXRlbmNpb25lcysgZXhwb190YysgZGlmX3ByZWNpb3MsDQogICAgICAgICB1bmlkYWQgPSAibWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1pcGNfMDgpIA0KcmVudGFfaGlkcm9jYXJidXJvc19mcg0KDQojZGFjaGV2c2t5DQpyZW50YV9mZCA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL290cm9zIGF1dG9yZXMvUG9uZW5jaWFKSElTREFjaGV2c2t5Lnhsc3giKSAlPiUNCiAgc2VsZWN0KGFuaW8gPSAiLi4uMSIsIHB2X25ldGEgPSAiLi4uMyIsIHN0b2NrPSBTdG9jaywgdGdfbm9ybWFsID0gInRnIGluZHVzdHJpYWwiKSAlPiUNCiAgc2xpY2UoLTEpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgbXV0YXRlKHJlbnRhX3RvdGFsID0gcHZfbmV0YSAtIChzdG9jay8xMDAwICogdGdfbm9ybWFsKSAsIGZ1ZW50ZSA9ICJGRCIpIA0KDQoNCiNvdHJvcyBhdXRvcmVzDQpyZW50YV9hdXRvcmVzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL290cm9zIGF1dG9yZXMvcmVudGFfYXV0b3Jlcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCg0KYGBgDQoNCg0KIyBWYXJpYWJsZXMNCg0KDQoNCiMjIyBQcm9kdWNjacOzbiBkZSBDcnVkbw0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcw0KcHJvZF9hbnVhcmlvIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvYW51YXJpb19kZV9jb21idXN0aWJsZXMvUHJvZHVjY2lvbl9EZXNkZV8xOTExLnhscyIpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsIGNydWRvX2FudWFyaW9fTW0zID0gIlBFVFJPTEVPIChNbTMpIiwgDQogIGdhc19oID0gYEdBUyBOQVRVUkFMIChNaWxsLiBtMylgLCBjYXJib25faCA9IGBDQVJCT04gKE1UbikgKCopYCkgJT4lIA0KICBtdXRhdGUoZ2FzX2FudWFyaW9fTU1tMyAgID0gYXMuZG91YmxlKGdhc19oKSwgDQogICAgICAgICBjYXJib25fYW51YXJpb19NdG4gICA9IGFzLmRvdWJsZShjYXJib25faCksDQogICAgICAgICBjcnVkb19hbnVhcmlvID0gY3J1ZG9fYW51YXJpb19NbTMgKiAxMDAwKSAlPiUgDQogIHNlbGVjdChhbmlvLCBjcnVkb19hbnVhcmlvLCBnYXNfYW51YXJpb19NTW0zLCBjYXJib25fYW51YXJpb19NdG4gKQ0KDQojIFJldmlzdGEgSURFRQ0KIyBQcm9kdWNjacOzbiBjcnVkbyBwb3IgYWRtaW5pc3RyYWNpw7NuIHkgY29udHJhdG9zDQpjdWFkcm9fMi4xIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvaWRlZS9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMSkgJT4lIA0KICByZW5hbWUodW5pZGFkID0gIi4uLjUiKQ0KDQojYmFzZSBNaW5pc3RlcmlvIGRlIEhhY2llbmRhDQpoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gPC0gIHJlYWRfY3N2KCIuLi9kYXRhL21lY29uL2hpZHJvY2FyYnVyb3NfcHJvZHVjY2lvbi5jc3YiLCANCiAgICBsb2NhbGUgPSBsb2NhbGUoZGF0ZV9uYW1lcyA9ICJlcyIsIGVuY29kaW5nID0gIklTTy04ODU5LTEiKSkgJT4lIA0KICBtdXRhdGUoZmVjaGEgPSBhcy5EYXRlKGx1YnJpZGF0ZTo6cGFyc2VfZGF0ZV90aW1lKGluZGljZV90aWVtcG8sIG9yZGVycyA9ICJkbXkiKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pLCAtYygxOjMsIGZ1ZW50ZSwgaW5kaWNlX3RpZW1wbyxhbGNhbmNlX2lkKSkNCg0KI2xpc3RhIGNvbiBpbmRpY2Fkb3Jlcw0KbGlzdGFfZmlsdHJvIDwtIHVuaXF1ZShoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24kaW5kaWNhZG9yKQ0KDQoNCnByb2RfbWVjb25fY3J1ZG8gPC0gaGlkcm9jYXJidXJvc19iYXNlX21lY29uICU+JSANCiAgZmlsdGVyKCBpbmRpY2Fkb3IgPT0gbGlzdGFfZmlsdHJvWzNdLA0KICAgICAgICAgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSA9PSAiUGV0csOzbGVvIGNydWRvIiwNCiAgICAgICAgIGZyZWN1ZW5jaWFfbm9tYnJlID09ICJNZW5zdWFsIikgJT4lICANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlLCBpbmRpY2Fkb3IsIHVuaWRhZF9kZV9tZWRpZGEpICU+JSANCiAgc3VtbWFyaXNlKGNydWRvX21lY29uID0gc3VtKHZhbG9yKSkNCg0KDQojQmFzZSByZWdhbGlhcw0KcHJvZF9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9yZWdhbGlhcy9wcm9kdWNjaW9uX2NydWRvX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIm0zIiwNCiAgICAgICAgIGFuaW8gPXpvbzo6bmEubG9jZihhbmlvKSwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIE1FUyksIG9yZGVycyA9ICJ5bSIpKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIE1FUywgYW5pbywgdW5pZGFkLCAiVE9UQUwgQ1VFTkNBIiwgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUocHJvZF9jcnVkb19tMyA9ICJUT1RBTCBDVUVOQ0EiKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKGNydWRvX3JlZ2FsaWFzID0gc3VtKHByb2RfY3J1ZG9fbTMpKQ0KDQojQmFzZSBTRVNDTyAuY3N2ICAoUHJlIDIwMDkpDQpwcm9kX3Nlc2NvX2NydWRvX2EgPC0gcmVhZF9jc3YoIi4uL2RhdGEvc2VjcmV0YXJpYV9lbmVyZ2lhL3Nlc2NvL3Byb2R1Y2Npbi1kZS1wZXRybGVvLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgJT4lDQogIHNlbGVjdChhbmlvLCBtZXMsaWRjb25jZXB0bywgY29uY2VwdG8sIENhbnRpZGFkICkgJT4lDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKSAlPiUNCiAgIyBmaWx0ZXIoIWlkY29uY2VwdG8gJWluJSBjKDQsIDUsIDcsIDgsIDkJKSkgJT4lDQogIGZpbHRlcihjb25jZXB0byAlaW4lIGMoIlByb2R1Y2Npw7NuIFByaW1hcmlhIChtMykiLCJQcm9kdWNjacOzbiBTZWN1bmRhcmlhIChtMykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9kdWNjacOzbiBwb3IgUmVjdXBlcmFjacOzbiBBaXNpc3RpZGEgKG0zKSIpKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShjcnVkb19zZXNjbyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiKQ0KDQojIEJhc2UgU0VTQ08gKFBvc3QgMjAwOSkNCnByb2Rfc2VzY29fY3J1ZG9fYiA8LSByZWFkX2NzdigiLi4vZGF0YS9zZWNyZXRhcmlhX2VuZXJnaWEvc2VzY28vcHJvZHVjY2luLWRlLXBldHJsZW8tcG9yLXlhY2ltaWVudG8uY3N2IikgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLGlkY29uY2VwdG8sIGNvbmNlcHRvLCBjYW50aWRhZCApICU+JQ0KICAjIGZpbHRlcighaWRjb25jZXB0byAlaW4lIGMoNCwgNSwgNywgOCwgOQkpKSAlPiUNCiAgIyBmaWx0ZXIoaWRjb25jZXB0byAlaW4lIGMoMSwyLDMsIDYpKSU+JQ0KICAgIGZpbHRlcihjb25jZXB0byAlaW4lIGMoIlByb2R1Y2Npw7NuIFByaW1hcmlhIChtMykiLCJQcm9kdWNjacOzbiBTZWN1bmRhcmlhIChtMykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9kdWNjacOzbiBwb3IgUmVjdXBlcmFjacOzbiBBaXNpc3RpZGEgKG0zKSIpKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShjcnVkb19zZXNjbyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiKQ0KDQpwcm9kX3Nlc2NvX2NydWRvIDwtIHByb2Rfc2VzY29fY3J1ZG9fYSAlPiUgDQogIGJpbmRfcm93cyhwcm9kX3Nlc2NvX2NydWRvX2IpDQoNCiMgU0VTQ08gZGVzZGUgMTk1MA0KICANCnByb2Rfc2VjX2VuZXJnaWEgPC0gcmVhZC5jc3YoICIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9zZXNjby9zZXJpZS1wcm9kdWNjaW9uLXBldHJvbGVvLXRvdGFsLXBhaXMtZGVzZGUtMTk1MC5jc3YiKSAlPiUgDQogIG11dGF0ZShwcm9kdWNjaW9uX3BldHJvbGVvID0gcHJvZHVjY2lvbl9wZXRyb2xlbyoxMDAwLA0KICAgICAgICAgdW5pZGFkID0gIm0zIikgJT4lIA0KICByZW5hbWUoY3J1ZG9fc2VjX2VuZXJnaWEgPSBwcm9kdWNjaW9uX3BldHJvbGVvKSANCg0KDQojRUlBDQoNCiN1bmlkYWQgb3JpZ2luYWwgPSBiYXJyZWxzIHBlciBkYXkNCg0KIyBUb3RhbCBQZXRyb2xldW0gYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiA9IENydWRlIG9pbCwgTkdQTCwgYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiArIFJlZmluZXJ5IHByb2Nlc3NpbmcgZ2Fpbg0KIyBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIHByb2R1Y3Rpb24gPSBDcnVkZSBvaWwgaW5jbHVkaW5nIGxlYXNlIGNvbmRlbnNhdGUgcHJvZHVjdGlvbiArIE5hdHVyYWwgZ2FzIHBsYW50IGxpcXVpZHMgcHJvZHVjdGlvbiArIE90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbg0KDQpwcm9kX2VpYV9jcnVkbyA8LSAgcmVhZF9jc3YoIi4uL2RhdGEvZWlhL29pbF9wcm9kdWN0aW9uX2FyZy5jc3YiLCANCiAgICB0cmltX3dzID0gRkFMU0UsIHNraXAgPSAxKSAlPiUgDQogIGZpbHRlcighaXMubmEoQVBJKSkgJT4lIA0KICBzZWxlY3QoLUFQSSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIHNwcmVhZCguLA0KICAgICAgICAga2V5ID0gIi4uLjIiLA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikgJT4lIA0KICByZW5hbWUodG90YWxfb2lsX2FuZF9vdGhlciA9IGAgICAgICAgIFRvdGFsIHBldHJvbGV1bSBhbmQgb3RoZXIgbGlxdWlkcyAoTWIvZClgLA0KICAgICAgICAgY3J1ZGVfb2lsX2NvbmRlbnNhdGUgPSBgICAgICAgICAgICAgICAgIENydWRlIG9pbCBpbmNsdWRpbmcgbGVhc2UgY29uZGVuc2F0ZSAoTWIvZClgLA0KICAgICAgICAgbmF0dXJhbF9nYXMgPSBgICAgICAgICAgICAgICAgIE5HUEwgKE1iL2QpYCwNCiAgICAgICAgIG90aGVyX2xpcXVpZHMgPSBgICAgICAgICAgICAgICAgIE90aGVyIGxpcXVpZHMgKE1iL2QpYCwNCiAgICAgICAgIGNydWRlX29pbF9uZ3BsX290aGVyX2xpcXVpZHMgPSBgICAgICAgICAgICAgQ3J1ZGUgb2lsLCBOR1BMLCBhbmQgb3RoZXIgbGlxdWlkcyAoTWIvZClgLA0KICAgICAgICAgcmVmaW5lcnlfcHJvY2Vzc2luZ19nYWluID0gYCAgICAgICAgICAgIFJlZmluZXJ5IHByb2Nlc3NpbmcgZ2FpbiAoTWIvZClgKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IChjKCJjcnVkZV9vaWxfY29uZGVuc2F0ZSIsICJuYXR1cmFsX2dhcyIsICJvdGhlcl9saXF1aWRzIiwgDQogICAgICAgICAgICAgICAgICAiY3J1ZGVfb2lsX25ncGxfb3RoZXJfbGlxdWlkcyIsICJyZWZpbmVyeV9wcm9jZXNzaW5nX2dhaW4iICAsInRvdGFsX29pbF9hbmRfb3RoZXIiKSksDQogICAgLmZ1bnMgPSBmdW5jdGlvbih4KSB7eCAqIDM2NSAqIDEwMDB9KSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pLA0KICAgICAgICAgdW5pZGFkID0gImJhcnJpbGVzIikNCg0KI0VJQSBhbGwgZGF0YQ0KZWlhX2FsbF9kYXRhIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2VpYS9JTlQtRXhwb3J0LTA5LTE3LTIwMjBfMTEtMTUtMTYuY3N2IiwgDQogICAgc2tpcCA9IDEpDQoNCg0KIyBDb21wYXJhY2nDs24gZW50cmUgc2VyaWVzDQpwcm9kX21lcmdlX2NydWRvIDwtICBwcm9kX3JlZ2FsaWFzX2NydWRvICU+JSANCiAgbGVmdF9qb2luKHByb2RfbWVjb25fY3J1ZG8gICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX21lY29uKSkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGNydWRvX3JlZ2FsaWFzLCBjcnVkb19tZWNvbikgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9zZXNjb19jcnVkbykgJT4lIA0KICBmdWxsX2pvaW4ocHJvZF9hbnVhcmlvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX2FudWFyaW8pICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJtMyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX3NlY19lbmVyZ2lhLCBieSA9IGMoImFuaW8iLCAidW5pZGFkIikpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gIGNydWRvX3JlZ2FsaWFzL2NydWRvX21lY29uLTEpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYyggICAiY3J1ZG9fcmVnYWxpYXMiICwiY3J1ZG9fbWVjb24iLCAgIA0KICAgICAgICAgICAgICAgICAgICAgICAiY3J1ZG9fc2VzY28iLCAgICAiY3J1ZG9fYW51YXJpbyIsICJjcnVkb19zZWNfZW5lcmdpYSIgKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9xKSAlPiUgIA0KICBsZWZ0X2pvaW4ocHJvZF9laWFfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY3J1ZG9fZWlhID0gY3J1ZGVfb2lsX2NvbmRlbnNhdGUpKSAlPiUgDQogICBtdXRhdGUocHJvZF9jcnVkbyA9ICBjYXNlX3doZW4oYW5pbyA8IDE5NTAgfiBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTUwOjIwMTUgfmNydWRvX3NlY19lbmVyZ2lhICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTUgfiBjcnVkb19zZXNjbyApLA0KICAgICAgICAgIHVuaWRhZCA9ICJiYXJyaWxlcyIsIA0KICAgICAgICAgIHZhcmlhYmxlID0gICJQcm9kdWNjacOzbiBkZSBjcnVkbyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiKSAgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzZWxlY3QoYW5pbywgdmFyaWFibGUsIHVuaWRhZCwgcHJvZF9jcnVkbywgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBjcnVkb19yZWdhbGlhcywNCiAgICAgICAgIG1lY29uID0gY3J1ZG9fbWVjb24sDQogICAgICAgICBzZXNjbyA9IGNydWRvX3Nlc2NvLA0KICAgICAgICAgYW51YXJpb19jb21idXN0aWJsZXMgPSBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgZWlhID0gY3J1ZG9fZWlhKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KDQojIHdyaXRlLmNzdihwcm9kX21lcmdlX2NydWRvLCBmaWxlID0gIi4uL3Jlc3VsdGFkb3MvZGF0YV92aXovcHJvZHVjY2lvbl9jcnVkby5jc3YiLCByb3cubmFtZXMgPSBGKQ0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgNiUgZW50cmUgbGFzIGJhc2VzIChlcyBtYXlvciBsYSBkZSBtZWNvbikNCiMgc3VtbWFyeShwcm9kX21lcmdlX2NydWRvKQ0KDQoNCiNFeGlzdGVuY2lhcw0KZXhpc3RlbmNpYXNfcGV0cm9sZW8gPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9zZWNyZXRhcmlhX2VuZXJnaWEvZXhpc3RlbmNpYXNfY3J1ZG8ueGxzeCIpICU+JQ0KICBmaWx0ZXIoIShpcy5uYShleGlzdGVuY2lhcyApKSkgJT4lIA0KICByZW5hbWUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBleGlzdGVuY2lhcykgJT4lIA0KICBtdXRhdGUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShleGlzdGVuY2lhc19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKQ0KDQojIHBsb3QoZXhpc3RlbmNpYXNfcGV0cm9sZW8kYW5pbywgZXhpc3RlbmNpYXNfcGV0cm9sZW8kZXhpc3RlbmNpYXNfY3J1ZG8pDQoNCmBgYA0KDQoNCg0KIyMjIFByb2R1Y2Npw7NuIGRlIEdhcyBOYXR1cmFsDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCYXNlIE1FQ09ODQpwcm9kX21lY29uX2dhcyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1szXSwNCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIkdhcyBuYXR1cmFsIiwNCiAgICAgICAgIGZyZWN1ZW5jaWFfbm9tYnJlID09ICJNZW5zdWFsIikgJT4lICANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlLCBpbmRpY2Fkb3IsIHVuaWRhZF9kZV9tZWRpZGEpICU+JSANCiAgc3VtbWFyaXNlKGdhc19tZWNvbiA9IHN1bSh2YWxvcikpDQoNCiNCYXNlIHJlZ2FsaWFzDQpwcm9kX3JlZ2FsaWFzX2dhcyA8LSByZWFkX2RlbGltKCIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9yZWdhbGlhcy9wcm9kdWNjaW9uX2dhc19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIsDQogICAgICAgICBhbmlvID0gem9vOjpuYS5sb2NmKGFuaW8pLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgTUVTKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgdW5pZGFkLCAiVE9UQUwgQ1VFTkNBIiwgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUocHJvZF9nYXNfTW0zID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkICkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBzdW1tYXJpc2UoZ2FzX3JlZ2FsaWFzID0gc3VtKHByb2RfZ2FzX01tMykpDQoNCiNCYXNlIFNFU0NPDQojcHJlIDIwMDkNCnByb2Rfc2VzY29fZ2FzX2EgPC0gcmVhZF9jc3YoIi4uL2RhdGEvc2VjcmV0YXJpYV9lbmVyZ2lhL3Nlc2NvL3Byb2R1Y2Npbi1kZS1nYXMtYW50ZXJpb3ItYWwtMjAwOS5jc3YiKSAgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLGlkY29uY2VwdG8sIGNvbmNlcHRvLCBDYW50aWRhZCApICU+JQ0KICByZW5hbWUoY2FudGlkYWQgPSBDYW50aWRhZCkgJT4lDQogIGZpbHRlcihpZGNvbmNlcHRvICE9IDQpICU+JQ0KICBncm91cF9ieShhbmlvKSAlPiUNCiAgc3VtbWFyaXNlKGdhc19zZXNjbyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsZXMgZGUgbTMiKQ0KDQojcG9zdCAyMDA5DQpwcm9kX3Nlc2NvX2dhc19iIDwtIHJlYWRfY3N2KCIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9zZXNjby9wcm9kdWNjaW4tZGUtZ2FzLXBvci15YWNpbWllbnRvLmNzdiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgY2FudGlkYWQgKSAlPiUNCiAgZmlsdGVyKGlkY29uY2VwdG8gJWluJSBjKDEsMiwzKSklPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KcHJvZF9zZXNjb19nYXMgPC0gcHJvZF9zZXNjb19nYXNfYSAlPiUNCiAgYmluZF9yb3dzKHByb2Rfc2VzY29fZ2FzX2IpDQoNCiNzZXNjbyBoaXN0b3JpYw0KcHJvZF9zZWNfZW5lcmdpYV9nYXMgPC0gcmVhZC5jc3YoICIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9zZXNjby9wcm9kdWNjaW9uZ2FzbmF0dXJhbGRlc2RlLTE5NTAuY3N2IikgJT4lIA0KICBtdXRhdGUocHJvZHVjY2lvbl9nYXNfbmF0dXJhbCA9IHByb2R1Y2Npb25fZ2FzX25hdHVyYWwqMTAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpICU+JSANCiAgcmVuYW1lKHNlY19lbmVyZ2lhX3Byb2QgPSBwcm9kdWNjaW9uX2dhc19uYXR1cmFsKSANCg0KDQoNCiNFSUENCnByb2RfZWlhX2RyeV9uYXR1cmFsX2dhcyA8LSByZWFkX2NzdigiLi4vZGF0YS9laWEvRHJ5X25hdHVyYWxfZ2FzX3Byb2R1Y3Rpb25fQXJnZW50aW5hX0FubnVhbC5jc3YiLCANCiAgICBza2lwID0gNCkgICU+JSANCiAgcmVuYW1lKGFuaW8gPSBZZWFyLA0KICAgICAgICAgcHJvZF9laWEgPSBgU2VyaWVzIElEOiBJTlRMLjI2LTEtQVJHLUJDRi5BIGJpbGxpb24gY3ViaWMgZmVldGApICU+JSANCiAgbXV0YXRlKHByb2RfZWlhID0gY29udmVyc29yX2Z0M20zX3EocHJvZF9laWEgKiAxMDAwMDAwKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpDQoNCg0KIyBDb21wYXJhY2nDs24gZW50cmUgc2VyaWVzDQpwcm9kX21lcmdlX2dhcyA8LSAgcHJvZF9yZWdhbGlhc19nYXMgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9tZWNvbl9nYXMgICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGdhc19tZWNvbikpICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBnYXNfcmVnYWxpYXMsIGdhc19tZWNvbikgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9zZXNjb19nYXMpICU+JSAgDQogIGZ1bGxfam9pbihwcm9kX2FudWFyaW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZ2FzX2FudWFyaW8gPSBnYXNfYW51YXJpb19NTW0zICkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZ2FzX2FudWFyaW8gPSBnYXNfYW51YXJpbyAqIDEwMDAsDQogICAgICAgICAgICAgICAgICAgICB1bmlkYWQgPSAiTWlsZXMgZGUgbTMiKSkgJT4lIA0KICAgICAgbGVmdF9qb2luKHByb2Rfc2VjX2VuZXJnaWFfZ2FzICU+JSBzZWxlY3QoYW5pbywgc2VjX2VuZXJnaWFfcHJvZCkpICU+JSANCiAgbGVmdF9qb2luKHByb2RfZWlhX2RyeV9uYXR1cmFsX2dhcyAlPiUgcmVuYW1lKGdhc19laWEgPSBwcm9kX2VpYSkpICU+JSANCiAgbXV0YXRlKHByb2RfZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTkzIH4gZ2FzX2FudWFyaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTIgfiBnYXNfc2VzY28pLA0KICAgICAgICAgIHZhcmlhYmxlID0gICJQcm9kdWNjacOzbiBkZSBnYXMgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIikgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgc2VsZWN0KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQsIHByb2RfZ2FzLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogICBmaWx0ZXIoIWlzLm5hKHByb2RfZ2FzKSkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBnYXNfcmVnYWxpYXMsDQogICAgICAgICBtZWNvbiA9IGdhc19tZWNvbiwNCiAgICAgICAgIHNlc2NvID0gZ2FzX3Nlc2NvLA0KICAgICAgICAgYW51YXJpb19jb21idXN0aWJsZXMgPWdhc19hbnVhcmlvLA0KICAgICAgICAgZWlhID0gZ2FzX2VpYSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCg0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgMTQlIGVudHJlIGxhcyBiYXNlcyAoZXMgbWF5b3IgbGEgZGUgbWVjb24pDQojIHN1bW1hcnkocHJvZF9tZXJnZV9nYXMpDQoNCnByb2RfbWVyZ2VfZ2FzX01NQlRVIDwtIHByb2RfbWVyZ2VfZ2FzICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9xKHgqMTAwMCl9KSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTU1CVFUiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQpwcm9kX21lcmdlX2dhc19iZXAgPC0gcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBncm91cF9ieShhbmlvLCB2YXJpYWJsZSwgdW5pZGFkKSAlPiUgDQogIG11dGF0ZV9hbGwoY29udmVyc29yX01NQlRVYmVwX3EpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJCRVAiKQ0KDQp3cml0ZS5jc3YocHJvZF9tZXJnZV9nYXNfTU1CVFUsIGZpbGUgPSAiLi4vcmVzdWx0YWRvcy9kYXRhX3Zpei9wcm9kdWNjaW9uX2dhcy5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkNCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfZ2FzX2JlcCwgZmlsZSA9ICJyZXN1bHRhZG9zL3Byb2RfbWVyZ2VfZ2FzX2JlcC5jc3YiKQ0KYGBgDQoNCg0KDQojIyMgUHJvZHVjY2lvbiB0b3RhbA0KYGBge3J9DQpwcm9kdWNjaW9uX3RvdGFsIDwtIHByb2RfbWVyZ2VfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9jcnVkbykgJT4lICBtdXRhdGUodW5pZGFkID0iQkVQIikgKSAlPiUgDQogIG11dGF0ZShwcm9kdWNjaW9uX3RvdGFsX2JlcCA9IHByb2RfY3J1ZG8gKyBwcm9kX2dhcykNCg0KcHJvZHVjY2lvbl90b3RhbA0KYGBgDQoNCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBDcnVkbyBwcm9jZXNhZG8NCg0KYGBgDQoNCg0KDQojIyBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vDQoNCg0KIyMjIyAgUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBDcnVkbw0KDQogIA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNNZW1vcmlhcyBkZSBZUEYNCnZ0YXNfcHJlY2lvX21lbW9feXBmX2NydWRvIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEveXBmL3Z0YXNfdmFsb3JfY2FudGlkYWRfcHJlY2lvX2NydWRvLnhsc3giKSAlPiUgDQogIHJlbmFtZShjYW50X3ZlbmRpZGFkID0gIm0zIiwgdmFsb3JfdmVuZGlkbyA9ICJ2YWxvciIsIHByZWNpb19hID0gIiQvbTMiLCANCiAgICAgICAgIHRjY19kaWMgPSAiQ290aXogZGljIFUkUyIsIHByZWNpb191c2QgPSAiVSRTIChhIGRpY2llbWJyZSBkZSBjYWRhIGHDsW8pIikgJT4lIA0KICBtdXRhdGUodW5pZGFkX2NhbnQgPSAibTMiLA0KICAgICAgICAgcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyA9IHZhbG9yX3ZlbmRpZG8vY2FudF92ZW5kaWRhZCwgDQogICAgICAgICBwcmVjaW9fbWlfeXBmX2NydWRvID0gcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyAvIHRjY19kaWMpICU+JSANCiAgIyBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpKSAlPiUNCiAgIyBtdXRhdGUocHJlY2lvX21pX3VzZF95cGZfY3J1ZG8gPSBwcmVjaW9fbWlfeXBmX2NydWRvIC8gdGNjKSAlPiUgI3JlY2FsY3VsbyBkZSBwcmVjaW8gY29uIG51ZXZvIFRDDQogIHNlbGVjdChhbmlvLHVuaWRhZF9jYW50LCBtb25lZGEsIHZhbG9yX3ZlbmRpZG8sIGNhbnRfdmVuZGlkYWQsIA0KICAgICAgICAgcHJlY2lvX21pX3Blc29zX3lwZl9jcnVkbyx0Y2NfZGljLCAgcHJlY2lvX21pX3lwZl9jcnVkbykNCg0KIyBCYXNlIE1FQ09ODQpwcmVjaW9fbWlfbWVjb25fY3J1ZG8gPC0gaGlkcm9jYXJidXJvc19iYXNlX21lY29uICU+JSANCiAgZmlsdGVyKGluZGljYWRvciA9PSBsaXN0YV9maWx0cm9bMl0sIA0KICAgICAgICAgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSA9PSAiUGV0csOzbGVvIGNydWRvIiwNCiAgICAgICAgIGFsY2FuY2VfdGlwbyA9PSAiUEFJUyIpICU+JQ0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9tZWNvbl9jcnVkbyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL20zIikNCg0KDQojTUVDT04gLyBDVUVOVEFTIE5BQ0lPTkFMRVMgDQpwcmVjaW9zX21lY29uIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvbWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgDQogICAgc2hlZXQgPSAiUHJlY2lvcyIsIHNraXAgPSA3KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIi4uLjEiLA0KICAgICAgICAgbWVzID0gIi4uLjIiLA0KICAgICAgICAgcHJlY2lvX2NvYnJlX2NfbGIgPSAiQ290aXphY2nDs24gQm9sc2EgZGUgTG9uZHJlcyAoTE1FKSIsDQogICAgICAgICBwcmVjaW9fb3JvX3VzZF9venQgPSAgIkNvdGl6YWNpw7NuIEJvbHNhIGRlIE51ZXZhIFlvcmsgKENPTUVYKSIsDQogICAgICAgICBwcmVjaW9fcGxhdGFfdXNkX296dCA9ICJDb3RpemFjacOzbiBMb25kb24gQnVsbGlvbiBNYXJrZXQgQXNzb2NpYXRpb24gKExCTUEpIiwNCiAgICAgICAgIHByZWNpb19jaW5jX2NfbGIgPSAiQ290aXphY2nDs24gTE1FIiwNCiAgICAgICAgIHByZWNpb19oaWVycm9fdXNkX3RuID0gIjY3LDU1JSBCcmFzaWwiLA0KICAgICAgICAgcHJlY2lvX3Bsb21vX3VzZF90biA9ICJMb25kb24gTWV0YWwgRXhjaGFuZ2UiLA0KICAgICAgICAgcHJlY2lvX2dhc19tZV9wZXNvc19NbTMgPSAibWVyY2FkbyBleHRlcm5vLi4uOSIsDQogICAgICAgICBwcmVjaW9fZ2FzX21pX3Blc29zX01tMyA9ICJtZXJjYWRvIGludGVybm8uLi4xMCIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWVfdXNkX20zID0gIm1lcmNhZG8gZXh0ZXJuby4uLjExIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfYmJsICA9ICIuLi4xMiIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfdXNkX20zID0gIm1lcmNhZG8gaW50ZXJuby4uLjEzIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19taV91c2RfYmJsICA9ICIuLi4xNCIsDQogICAgICAgICBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCA9ICJQcm9tZWRpbyBCcmVudC1EdWJhaS1XVEkiLA0KICAgICAgICAgYnJlbnRfdWtfdXNkX2JibCA9IkJyZW50ICBQdWVydG9zIEdyYW4gQnJldGHDsWEiKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX2dhc19tZV9wZXNvc19NbTMgPSBtZWFuKHByZWNpb19nYXNfbWVfcGVzb3NfTW0zLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJlY2lvX2dhc19taV9wZXNvc19NbTMgPSBtZWFuKCBwcmVjaW9fZ2FzX21pX3Blc29zX01tMywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfYmJsID0gbWVhbiggcHJlY2lvX2NydWRvX21lX3VzZF9iYmwsIG5hLnJtID0gVCksDQogICAgICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCA9IG1lYW4oIHByZWNpb19jcnVkb19taV91c2RfYmJsLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJvbWVkaW9fYnJlbnRfZHViYWlfd3RpX3VzZF9iYmwgPSBtZWFuKCBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGJyZW50X3VrX3VzZF9iYmwgPSBtZWFuKCBicmVudF91a191c2RfYmJsLCBuYS5ybSA9IFQpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwpICU+JSANCiAgbXV0YXRlKCBwcmVjaW9fY3J1ZG9fbWVfcGVzb3NfYmJsID0gIHByZWNpb19jcnVkb19tZV91c2RfYmJsICpUQ0MsDQogICAgICAgICAgcHJlY2lvX2NydWRvX21pX3Blc29zX2JibCA9ICBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCAqVENDKQ0KDQoNCiMjIEJhc2UgcmVnYWxpYXMNCnByZWNpb19taV9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9yZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19pbnRlcm5vX2NydWRvX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsDQogICAgICAgICB0b3RhbF90aXBvX2NydWRvID0gIlRPVEFMIFRJUE8gREUgQ1JVRE8iKSAlPiUgDQogICAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvbTMiLA0KICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbykpICU+JSAgDQogIHNlbGVjdChhbmlvLCBtZXMsIHVuaWRhZCwgdG90YWxfdGlwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLWMoQlJFTlQsIFdUSSkpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAidGlwb19jcnVkbyIsDQogICAgICAgICB2YWx1ZSA9ICJ2YWxvciIsDQogICAgICAgICA1Om5jb2woLikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUNCiAgc3VtbWFyaXNlKHByZWNpb19taV9yZWdhbGlhc19jcnVkbyA9IG1lYW4odG90YWxfdGlwb19jcnVkbyksDQogICAgICAgICAgICBwcmVjaW9fcHJvbWVkaW9fdGlwb19jcnVkbyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIG11dGF0ZSh0aXBvX3ByZWNpbyA9ICJtZXJjYWRvIGludGVybm8iKQ0KDQojIFJldmlzdGEgSURFRQ0KIyBwcmVjaW9zIGludGVybm9zIHZzIHByZWNpbyBwcm9tZWRpbyBpbnRlcm5vIGRlIGVldXUgdnMgcHJlY2lvIGFyYWJhaSBzYXVkaXRhLiBjdWFkcm8gMy4xLjMuMSBwLjE3MA0KcHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkbyA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL2lkZWUvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDQpDQoNCg0KI21lcmdlDQpwcmVjaW9fbWlfY3J1ZG8gPC0gcHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvICU+JSAgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19taV9yZWdhbGlhc19jcnVkbykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX21lY29uX2NydWRvICkgJT4lIA0KICBmdWxsX2pvaW4odnRhc19wcmVjaW9fbWVtb195cGZfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgICBwcmVjaW9fbWlfeXBmX2NydWRvICkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV92c19pbnRlcm5hY2lvbmFsX2lkZWVfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX21pX2lkZWVfY3J1ZG8gPSBwcmVjaW9fY3J1ZG9fbmV1cXVpbmFfdGNfb2ZpY2lhbCApKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL20zIikgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8iLCANCiAgICAgICAgICAgICAgICAgICAgICAicHJlY2lvX21pX21lY29uX2NydWRvIiwgInByZWNpb19taV95cGZfY3J1ZG8iLCAicHJlY2lvX21pX2lkZWVfY3J1ZG8iKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9wKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19taV9tZWNvbl9jY25uX2NydWRvID0gcHJlY2lvX2NydWRvX21pX3VzZF9iYmwgKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBpbV9iYXNlOTQgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgaXBpbV9uaXZlbF9ncmFsXzk0KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gcHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvLA0KICAgICAgICAgbWVjb24gPSBwcmVjaW9fbWlfbWVjb25fY3J1ZG8sDQogICAgICAgICB5cGYgPSBwcmVjaW9fbWlfeXBmX2NydWRvLA0KICAgICAgICAgaWRlZSA9IHByZWNpb19taV9pZGVlX2NydWRvLA0KICAgICAgICAgbWVjb25fY2NubiA9IHByZWNpb19taV9tZWNvbl9jY25uX2NydWRvKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICB1bmdyb3VwKCkNCg0KcHJlY2lvX21pX2NydWRvIDwtICBwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICBtdXRhdGUoIHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgICB2YXJpYWJsZSA9ICAiUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkbyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiLA0KICAgICAgICAgIG1lY29uX2VzdGltYWRvID0gcHJlY2lvX21pX2NydWRvJG1lY29uW3ByZWNpb19taV9jcnVkbyRhbmlvPT0xOTk0XSppcGltX25pdmVsX2dyYWxfOTQsDQogICAgICAgICAgaW5kaWNlX3lwZl83MiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0geXBmLCBmZWNoYSA9IGFuaW8sIGZlY2hhX2Jhc2UgPSAxOTcyKSwNCiAgICAgICAgIGlkZWVfZXN0aW1hZG8gPSBwcmVjaW9fbWlfY3J1ZG8kaWRlZVtwcmVjaW9fbWlfY3J1ZG8kYW5pbz09MTk3Ml0gKiBpbmRpY2VfeXBmXzcyLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21kb2ludCA9ICAgY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTYzOjE5NjUgfiBpZGVlX2VzdGltYWRvLA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTY2OjE5ODggfiBpZGVlLA0KICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTg5OjE5OTEgfiB5cGYsDQogICAgICAgICAgICAgICAgYW5pbyA9PSAxOTkyIH4gbWVjb25fZXN0aW1hZG8sDQogICAgICAgICAgICAgICAgYW5pbyA+MTk5MiB+IG1lY29uKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCB2YXJpYWJsZSwgcHJlY2lvX2NydWRvX21kb2ludCAsIGV2ZXJ5dGhpbmcoLiksIA0KICAgICAgICAgLWMoaXBpbV9uaXZlbF9ncmFsXzk0LCBpZGVlX2VzdGltYWRvLG1lY29uX2VzdGltYWRvLGluZGljZV95cGZfNzIsaWRlZV9lc3RpbWFkbyApKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KICANCiAgDQojIHdyaXRlLmNzdihwcmVjaW9fbWlfY3J1ZG8sIGZpbGUgPSAiLi4vcmVzdWx0YWRvcy9kYXRhX3Zpei9wcmVjaW9fbWlfY3J1ZG8uY3N2Iiwgcm93Lm5hbWVzID0gRikNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19taV92c19pbnRlcm5hY2lvbmFsX2lkZWVfY3J1ZG8gJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcmVjaW9fY3J1ZG9fbmV1cXVpbmFfdGNfb2ZpY2lhbCApICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIHNwcmVhZCguLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGFuaW8sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwcmVjaW9fY3J1ZG9fbmV1cXVpbmFfdGNfb2ZpY2lhbCkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHZhcmlhYmxlID0gInByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsIGVuIFVTRC9tMyIpICU+JQ0KIyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHZhcmlhYmxlLCBldmVyeXRoaW5nKC4pKSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInByZWNpb19taV92c19pbnRlcm5hY2lvbmFsX2lkZWVfY3J1ZG8ueGxzeCIpDQpgYGANCg0KDQoNCg0KDQoNCiMjIyMgUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBHYXMgTmF0dXJhbA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNBbnVhcmlvIFlQRg0KdnRhc19wcmVjaW9fbWVtb195cGZfZ2FzIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEveXBmL3Z0YXNfdmFsb3JfY2FudGlkYWRfcHJlY2lvX2dhcy54bHN4IikgJT4lIA0KICAgIHJlbmFtZShjYW50X3ZlbmRpZGFkID0gIm0zIiwgdmFsb3JfdmVuZGlkbyA9ICIkIiwgbW9uZWRhID0gIk1vbmVkYSIpICU+JSANCiAgbGVmdF9qb2luKHZ0YXNfcHJlY2lvX21lbW9feXBmX2NydWRvICU+JSBzZWxlY3QoYW5pbywgbW9uZWRhLCB0Y2NfZGljICkpICU+JSANCiAgbXV0YXRlKHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCA9ICh2YWxvcl92ZW5kaWRvL2NhbnRfdmVuZGlkYWQpIC8gMTAwMCwNCiAgICAgICAgIHByZWNpb19taV91c2RfeXBmX2dhcyA9IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCAvIHRjY19kaWMsDQogICAgICAgICBwcmVjaW9fbWlfeXBmX2dhcyA9IGNhc2Vfd2hlbiggI2hvbW9nZW5pemFtb3MgbG9zIGNhbWJpb3MgZGUgbW9uZWRhDQogICAgICAgICAgIG1vbmVkYSA9PSAibSRuIiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkYG0kbmAgLA0KICAgICAgICAgICBtb25lZGEgPT0gIiRsZXkiIH4gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsL2NvbnZlcnNvcl9wZXNvcyRgJExleWAsIA0KICAgICAgICAgICBtb25lZGEgPT0gIiRhcmciIH4gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsL2NvbnZlcnNvcl9wZXNvcyRgJGFgLCANCiAgICAgICAgICAgbW9uZWRhID09ICJBIiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkQSwNCiAgICAgICAgICAgVCB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCksDQogICAgICAgICBtb25lZGEgPSAiYXJzIiwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgI2FjbGFyYW1vcyBsYSB1bmlkYWQgbW9uZXRhcmlhIHlhIHRyYW5zZm9ybWFkYQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBtb25lZGEsIHZhbG9yX3ZlbmRpZG8sIGNhbnRfdmVuZGlkYWQsIA0KICAgICAgICAgcHJlY2lvX21pX3lwZl9nYXMscHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsLCB0Y2NfZGljLCBwcmVjaW9fbWlfdXNkX3lwZl9nYXMpDQoNCiNBbnVhcmlvIENvbWJ1c3RpYmxlDQphbnVhcmlvX2RlX2NvbWJ1c3RpYmxlIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvYW51YXJpb19kZV9jb21idXN0aWJsZXMvYW51YXJpbyBkZSBjb21idXN0aWJsZS54bHN4IikgJT4lIA0KICBmaWx0ZXIobWVyY2FuY2lhID09ICJnYXNfbmF0dXJhbCIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbyAsICAgICBtZXMsICAgICAgdW5pZGFkICkgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX21pX2FudWFyaW9fZ2FzID0gbWVhbih2YWxvcikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbyAsICAgICAgIHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9hbnVhcmlvX2dhcyA9IG1lYW4ocHJlY2lvX21pX2FudWFyaW9fZ2FzKSkgJT4lIA0KICBtdXRhdGUocHJlY2lvX21pX2FudWFyaW9fZ2FzID0gKHByZWNpb19taV9hbnVhcmlvX2dhcy9jb252ZXJzb3JfcGVzb3MkQSkvMTAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQojIEJhc2UgTUVDT04NCnByZWNpb3NfaW50ZXJub3NfbWVjb25fZ2FzIDwtIGhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiAlPiUgDQogIGZpbHRlcihpbmRpY2Fkb3IgPT0gbGlzdGFfZmlsdHJvWzJdLCANCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIkdhcyBuYXR1cmFsIiwNCiAgICAgICAgIGFsY2FuY2VfdGlwbyA9PSAiUEFJUyIpICU+JQ0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9tZWNvbl9nYXMgPSBtZWFuKHZhbG9yKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpDQoNCg0KIyMgQmFzZSByZWdhbGlhcw0KI3ZhbG9yZXMgOTMgLSA5OA0KcHJlY2lvX3JlZ2FsaWFzX3RvdGFsX2dhcyA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9yZWdhbGlhcy9wcmVjaW9fbWlfZ2FzLnhsc3giLA0KICAgIHNoZWV0ID0gImprIikgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDE5OTkpICU+JSANCiAgbXV0YXRlKHByZWNpb190b3RhbF9nYXMgPSBwcmVjaW9fbWlfZ2FzICogMTAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX21pX2dhcykNCg0KI3ZhbG9yZXMgcG9zdCA5OQ0KcHJlY2lvX3JlZ2FsaWFzX21pX2dhcyA8LSByZWFkX2RlbGltKCIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9yZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19pbnRlcm5vX2dhc19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JQ0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfY3VlbmNhID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiLA0KICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbykpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCAgZXZlcnl0aGluZyguKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJjdWVuY2EiLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGdzdWIoIiwiLCAiIiwgdmFsb3IpLA0KICAgICAgICAgdmFsb3IgPSBhcy5kb3VibGUodmFsb3IpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCwgY3VlbmNhKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fcHJvbWVkaW9fY3VlbmNhID0gbWVhbih2YWxvcikpJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBpbnRlcm5vIikgJT4lIA0KICBmaWx0ZXIoY3VlbmNhID09ICJ0b3RhbF9jdWVuY2EiKSU+JSAgI3F1aXRvIHByZWNpbyBwcm9tZWRpbyBlbGFib3JhZG8gcHEgbm8gc2UgdXNhcsOhDQogIGxlZnRfam9pbihwcmVjaW9fcmVnYWxpYXNfdG90YWxfZ2FzKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTk5IH4gcHJlY2lvX3RvdGFsX2dhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHByZWNpb19wcm9tZWRpb19jdWVuY2EpKSAlPiUgDQogIHNlbGVjdCgtYyhwcmVjaW9fdG90YWxfZ2FzLCBwcmVjaW9fcHJvbWVkaW9fY3VlbmNhKSkNCg0KI1JldmlzdGEgSURFRQ0KI3ByZWNpbyB0cmFuc2ZlcmVuY2lhLCByZWdhbGlhcywgY29tcGVuc2FjaW9uZXMsIGV0YyBwcm9tZWRpbyBhbnVhbA0KcHJlY2lvX21pX2lkZWVfZ2FzIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvaWRlZS9QcmVjaW9zIGRlbCBnYXMgbmF0dXJhbCB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OC54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fdHJhbnNmZXJlbmNpYSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzcwKSkgJT4lDQogIG11dGF0ZShwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MgPSBwcmVjaW9fdHJhbnNmZXJlbmNpYSAqIGlwY183MCAvIGNvbnZlcnNvcl9wZXNvcyRgJExleWApICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSApICU+JSANCiAgbXV0YXRlKHByZWNpb19taV9pbmRleGFkb191c2QgPSBwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MvdGNjICkgIA0KICAjIHNlbGVjdCgtYyh1bmlkYWQsIHByZWNpb190cmFuc2ZlcmVuY2lhKSkNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19taV9pZGVlX2dhcywgcGF0aCA9ICJwcmVjaW9fbWlfaWRlZV9nYXMueGxzeCIpDQoNCiNjb252ZXJzb3IgZGUgbW9uZWRhIA0KIyAlPiUgDQojICAgbXV0YXRlKHByZWNpb190cmFuc2ZlcmVuY2lhID0gY2FzZV93aGVuKA0KIyAgICAgYW5pbyA8IDE5ODMgfiBwcmVjaW9fdHJhbnNmZXJlbmNpYS9jb252ZXJzb3JfcGVzb3MkYCRMZXlgLA0KIyAgICAgYW5pbyA9PSAxOTgzIH4gcHJlY2lvX3RyYW5zZmVyZW5jaWEgLyBjb252ZXJzb3JfcGVzb3MkYCRhYCwNCiMgICAgIGFuaW8gJWluJSAxOTgzOjE5OTEgfiBwcmVjaW9fdHJhbnNmZXJlbmNpYS9jb252ZXJzb3JfcGVzb3MkQSkpDQoNCiNNZXJnZQ0KcHJlY2lvX21pX2dhcyA8LSBwcmVjaW9fcmVnYWxpYXNfbWlfZ2FzICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX21pX3JlZ2FsaWFzX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19pbnRlcm5vc19tZWNvbl9nYXMpICU+JSANCiAgZnVsbF9qb2luKHZ0YXNfcHJlY2lvX21lbW9feXBmX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsICBwcmVjaW9fbWlfeXBmX2dhcyApKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfaWRlZV9nYXMgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8gPSBwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmVjaW9fbWlfaWRlZV9jdGVzX3Blc29zID0gcHJlY2lvX3RyYW5zZmVyZW5jaWEpKSAlPiUgDQogIGxlZnRfam9pbihhbnVhcmlvX2RlX2NvbWJ1c3RpYmxlKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBwcmVjaW9fbWlfbWVjb25fY2Nubl9nYXMgPSBwcmVjaW9fZ2FzX21pX3Blc29zX01tMykpICU+JSANCiAgIyBtdXRhdGUocHJlY2lvX2dhc19tZG9pbnQgPSBjYXNlX3doZW4oYW5pbyA8IDE5ODggfiBwcmVjaW9fbWlfeXBmX2dhcywNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODggfiAgcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8sDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5ODk6MTk5MSAgfiBwcmVjaW9fbWlfeXBmX2dhcywNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5OTIgIH4gcHJlY2lvX21pX3lwZl9nYXMvMTAsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTIgfiBwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzKSwNCiAgIyAgICAgICAgZGlmX3lwZl9pZGVlID0gcHJlY2lvX21pX3lwZl9nYXMvcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8tMSApICU+JQ0KICBtdXRhdGUodmFyaWFibGUgPSAiUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIsDQogICAgICAgICBwcmVjaW9fZ2FzX21kb2ludCA9IGNhc2Vfd2hlbihhbmlvICVpbiUgMTk2MzoxOTY5fGFuaW8gJWluJSAxOTg5OjE5OTEgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19taV95cGZfZ2FzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5NzA6MTk4OCB+IHByZWNpb19taV9pZGVlX2luZGV4YWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5OTIgIH4gcHJlY2lvX21pX3lwZl9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gcHJlY2lvX21pX3JlZ2FsaWFzX2dhcykgKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsdmFyaWFibGUsIHByZWNpb19nYXNfbWRvaW50LCBldmVyeXRoaW5nKC4pICkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzLA0KICAgICAgICAgbWVjb24gPSBwcmVjaW9fbWlfbWVjb25fZ2FzLA0KICAgICAgICAgeXBmID0gcHJlY2lvX21pX3lwZl9nYXMsDQogICAgICAgICBpZGVlID0gcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8sDQogICAgICAgICBtZWNvbl9jY25uID0gcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzLA0KICAgICAgICAgYW51YXJpbyA9IHByZWNpb19taV9hbnVhcmlvX2dhcykgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCiNwcmVjaW8gaW50ZXJubyBlbiBNTUJUVSBwZXNvcw0KcHJlY2lvX21pX2dhc19NTUJUVSA8LSAgcHJlY2lvX21pX2dhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc2VsZWN0KC1jKHVuaWRhZCwgdmFyaWFibGUpKSAlPiUgDQogIG11dGF0ZV9hbGwoIGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9wKHgvMTAwMCl9KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01NQlRVIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KDQojcHJlY2lvIGludGVybm8gZW4gTU1CVFUgdXNkDQpwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkIDwtIHByZWNpb19taV9nYXNfTU1CVFUgJT4lDQogICMgc2VsZWN0KC1kaWZfeXBmX2lkZWUpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yLyB0Y2MsDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01NQlRVIikgJT4lIA0KICBzZWxlY3QoLWModGNjLHRjcCwgc29icmV2YWx1YWNpb24pKSAlPiUgDQogIHNwcmVhZChrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpDQoNCg0KIyB3cml0ZS5jc3YocHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCwgZmlsZSA9ICIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L3ByZWNpb19taV9nYXMuY3N2Iiwgcm93Lm5hbWVzID0gRikNCg0KI3ByZWNpbyByZXZpc3RhIHRyYW5zcHVlc3RvDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX2lkZWVfZ2FzICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UgPXByZWNpb190cmFuc2ZlcmVuY2lhICkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKC4sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYW5pbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByZWNpb190cmFuc2ZlcmVuY2lhX3lwZl9hX0dFKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodmFyaWFibGUgPSAicHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UgZW4gcGVzb3MgZGUgMTk3MC8xMDAwIG0zIikgJT4lDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodmFyaWFibGUsIGV2ZXJ5dGhpbmcoLikpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicHJlY2lvX21pX2lkZWVfZ2FzLnhsc3giKQ0KDQojIGdyYWZfbWlfZ2FzIDwtIHByZWNpb19taV9pZGVlX2dhcyAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHByZWNpb19taV9pbmRleGFkb19wZXNvcywgcHJlY2lvX21pX2luZGV4YWRvX3VzZCkgJT4lIA0KIyAgIGdhdGhlciguLA0KIyAgICAgICAgICBrZXkgPSB2YXJpYWJsZSAsDQojICAgICAgICAgIHZhbHVlID0gdmFsb3IsDQojICAgICAgICAgIDI6MykgJT4lDQojICAgZmlsdGVyKHZhcmlhYmxlID09InByZWNpb19taV9pbmRleGFkb191c2QiICkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdmFyaWFibGUpKSsNCiMgICBnZW9tX2xpbmUoKQ0KIyBncmFmX21pX2dhcw0KDQojIHByZWNpb19taV9nYXMgJT4lIA0KIyAgIGZpbHRlcihhbmlvID4gMjAwMCkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZ2FzX21kb2ludCwgcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzKQ0KYGBgDQoNCg0KDQoNCiMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgTWVyY2FkbyBNdW5kaWFsDQoNCiAgDQoNCiMjIyMgUHJlY2lvcyBkZSBSZWZlcmVuY2lhIGRlbCBDcnVkbw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0Jhc2UgcmVnYWxpYXMNCnByZWNpb19tZV9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9yZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19leHRlcm5vX2NydWRvX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsDQogICAgICAgICB0b3RhbF90aXBvX2NydWRvID0gIlRPVEFMIFRJUE8gREUgQ1JVRE8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL20zIiwNCiAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUNCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCB0b3RhbF90aXBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyhCUkVOVCwgV1RJKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJ0aXBvX2NydWRvIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBzdW1tYXJpc2UocHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8gPSBtZWFuKHRvdGFsX3RpcG9fY3J1ZG8pKSAlPiUgDQogICAgICAgICAgICAjIHByZWNpb19wcm9tZWRpb190aXBvX2NydWRvID0gbWVhbih2YWxvcikpJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBleHRlcm5vIiwNCiAgICAgICAgIHByZWNpb190b3RhbF90aXBvX2NydWRvID0gY29udmVyc29yX20zYmJsX3AocHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8pLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9iYXJyaWxlcyIpDQoNCiMgTWVjb24gTU9ESUZJQ0FSIA0KcHJlY2lvX2V4cG9ydGFjaW9uX2NydWRvIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvbWVjb24vcHJlY2lvLWV4cG9ydGFjaW9uLWNydWRvLnhsc3giLCANCiAgICBza2lwID0gMikNCg0KI0lOREVDIENvbUV4DQpwcmVjaW9fZXhwb19pbmRlYyA8LSByZWFkX2NzdigiLi4vZGF0YS9pbmRlYy9wcmVjaW9fYW51YWxfcHJvbWVkaW9fZXhwb19oaWRyb19pbmRlYy5jc3YiLCAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwgJT4lIHNlbGVjdCgtVENQKSkgICU+JSANCiAgbXV0YXRlKCBwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSAocHJlY2lvX2V4cG9fZ2FzX2luZGVjKSAqIFRDQywNCiAgICAgICAgICAgICAgICAgICAgICB1bmlkYWRfZ2FzID0gImFycy9NaWxlcyBkZSBtMyIJKQ0KICAjIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSBwcmVjaW9fZXhwb19nYXNfaW5kZWMgKiBUQ0MsIA0KICAjICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4odW5pZGFkID09ICJVU0QvTWlsZXMgZGUgbTMiIH4gImFycy9NaWxlcyBkZSBtMyIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSkNCg0KI1VOIENPTVRSQURFDQpleHBvX2NydWRvX3VuY29tdHJhZGVfaHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdW5fY29tdHJhZGUvZXhwb19jcnVkb191bmNvbXRyYWRlX2hzLmNzdiIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9wcmVjaW8gPSAiVVNEL2JhcnJpbGVzIiwNCiAgICAgICAgIHVuaWRhZF92YWxvciA9ICJVU0QiLA0KICAgICAgICAgdW5pZGFkX2NhbnRpZGFkID0gImJhcnJpbGVzIikgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCwNCiAgICAgICAgIHByZWNpb19leHBvX2NvbXRyYWRlX2hzX2NydWRvID0gZXhwb19wcmVjaW9fYmJsLCANCiAgICAgICAgIGV4cG9fdXNkX2NvbXRyYWRlX2NydWRvID0gIlRyYWRlIFZhbHVlIChVUyQpIikNCg0KZXhwb19jcnVkb19zaXRjIDwtIHJlYWRfY3N2KCIuLi9kYXRhL3VuX2NvbXRyYWRlL2V4cG9fY3J1ZG9fc2l0Yy5jc3YiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfcHJlY2lvID0gIlVTRC9iYXJyaWxlcyIsDQogICAgICAgICB1bmlkYWRfdmFsb3IgPSAiVVNEIiwNCiAgICAgICAgIHVuaWRhZF9jYW50aWRhZCA9ICJiYXJyaWxlcyIpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QsDQogICAgICAgICBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvID0gZXhwb19wcmVjaW9fYmJsLCANCiAgICAgICAgIGV4cG9fdXNkX2NvbXRyYWRlX2NydWRvID0gIlRyYWRlIFZhbHVlIChVUyQpIikNCg0KI01lcmdlIGJhc2VzDQpwcmVjaW9fZXhwb19jcnVkbyA8LSBwcmVjaW9fbWVfcmVnYWxpYXNfY3J1ZG8gJT4lIA0KICByZW5hbWUocHJlY2lvX2V4cG9fcmVnYWxpYXNfY3J1ZG8gPSBwcmVjaW9fdG90YWxfdGlwb19jcnVkbykgJT4lIA0KICBzZWxlY3QoLXRpcG9fcHJlY2lvKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19leHBvX21lY29uX2NydWRvID0gcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgKSkgJT4lDQogIGxlZnRfam9pbihwcmVjaW9fZXhwb19pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtYyhwcmVjaW9fZXhwb19nYXNfaW5kZWMsIHVuaWRhZF9nYXMpKSkgJT4lDQogIGxlZnRfam9pbihleHBvX2NydWRvX3VuY29tdHJhZGVfaHMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8pKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2NydWRvX3NpdGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JQ0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgIyBtdXRhdGUocHJlY2lvX2V4cG9fY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyA8IDE5OTMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5OTM6MjAxNCB+IHByZWNpb19leHBvX21lY29uX2NydWRvLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTQgfiBwcmVjaW9fZXhwb19yZWdhbGlhc19jcnVkbykpICU+JSANCiAgIyBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXhwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLVRDQykNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSwgLVRDQykNCiMgcHJlY2lvX2V4cG9fY3J1ZG8NCg0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFByZWNpbyBSZWZlcmVuY2lhIE1lcmNhZG8gRXh0ZXJubyBDcnVkbw0KI0JyZW50DQpicmVudF9hIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvcHJlY2lvc19tdW5kaWFsZXMvYnJlbnQueGxzeCIsIA0KICAgIHNraXAgPSA0KSU+JSAgDQogIHJlbmFtZShhbmlvID0gWWVhciwgYnJlbnRfbm9taW5hbCA9IGBOb21pbmFsIFByaWNlYCwgYnJlbnRfYWRqdXN0ZWQgPSBgSW5mbGF0aW9uIEFkanVzdGVkIFByaWNlYCkgICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkgDQoNCg0KYnJlbnRfZGFpbHkgIDwtICByZWFkX2V4Y2VsKCIuLi9kYXRhL2VpYS9SQlJURWQueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JQ0KICByZW5hbWUoZmVjaGEgPSBEYXRlLCBicmVudF9zcG90ID0gYEV1cm9wZSBCcmVudCBTcG90IFByaWNlIEZPQiAoRG9sbGFycyBwZXIgQmFycmVsKWApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKGZlY2hhKSwgDQogICAgICAgICBhbmlvID0geWVhcihmZWNoYSkpIA0KDQpicmVudF9JRUEgIDwtICBicmVudF9kYWlseSAlPiUgDQogIGdyb3VwX2J5KHVuaWRhZCwgYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoYnJlbnRfc3BvdCA9IG1lYW4oYnJlbnRfc3BvdCkpDQoNCmJyZW50IDwtIGJyZW50X2EgJT4lDQogIHNlbGVjdCgtYnJlbnRfYWRqdXN0ZWQpICU+JSANCiAgbGVmdF9qb2luKGJyZW50X0lFQSkgJT4lIA0KICAjIG11dGF0ZShkaWYgPSBicmVudF9zcG90L2JyZW50X25vbWluYWwgLSAxKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgcmVuYW1lKGJyZW50X2llYSA9IGJyZW50X3Nwb3QsDQogICAgICAgICBicmVudF9oaXN0b3JpYyA9IGJyZW50X25vbWluYWwpDQoNCiNXVEkgDQp3dGlfRUlBX2RhaWx5IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvZWlhL1JXVENkLnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSh3dGlfZWlhID0gYEN1c2hpbmcsIE9LIFdUSSBTcG90IFByaWNlIEZPQiAoRG9sbGFycyBwZXIgQmFycmVsKWAgKSAlPiUgDQogIG11dGF0ZShtZXMgPSBtb250aChEYXRlKSwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKERhdGUpLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9iYXJyaWxlcyIpDQoNCnd0aV9FSUEgPC0gd3RpX0VJQV9kYWlseSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2Uod3RpX2VpYSA9IG1lYW4od3RpX2VpYSwgbmEucm0gPSBUKSkNCg0Kd3RpX2ZyZWQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZnJlYWQvV1RJU1BMQy5jc3YiKSAgJT4lDQogIHJlbmFtZSh3dGlfc3BvdF9wcmljZSA9IFdUSVNQTEMpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKERBVEUpLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9iYXJyaWxlcyIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZSh3dGlfc3BvdF9wcmljZV9mcmVkID0gbWVhbih3dGlfc3BvdF9wcmljZSkpDQogIA0Kd3RpX3JldGVuY2lvbl8wNCA8LSB3dGlfRUlBX2RhaWx5ICAlPiUgDQogIGZpbHRlcihhbmlvID4gMjAwMyApICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgbWVzKSAlPiUgDQogIHN1bW1hcmlzZSh3dGkgPSBtZWFuKHd0aV9laWEpKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb24gPSBjYXNlX3doZW4od3RpIDwgMzIgfiAwLjI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzMiAmIHd0aSA8IDM0Ljk5IH4gMC4yOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gMzUgJiB3dGkgPCAzNi45OSB+IDAuMzEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDM3ICYgd3RpIDwgMzguOTkgfiAwLjM0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzOSAmIHd0aSA8IDQwLjk5IH4gMC4zNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gNDEgJiB3dGkgPCA0Mi45OSB+IDAuNDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDQzICYgd3RpIDwgNDQuOTkgfiAwLjQzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSA0NSB+IDAuNDUpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHJldGVuY2lvbiA9IG1lYW4ocmV0ZW5jaW9uKSkNCg0KDQp3dGlfcmV0ZW5jaW9uXzA3IDwtIHd0aV9FSUFfZGFpbHkgJT4lIA0KICBmaWx0ZXIoYW5pbyAlaW4lIGMoIDIwMDc6MjAxNCksIERhdGUgPiAiMjAwNy0xMS0wMiIgKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb24gPSBjYXNlX3doZW4od3RpX2VpYSA+PSA2MC45IH4gKHd0aV9laWEgLSA0MikvNDIgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aV9laWEgPCA2MC45IH4gMC40NSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2Uod3RpX2VpYSA9IG1lYW4od3RpX2VpYSksDQogICAgICAgICAgICByZXRlbmNpb24gPSAgbWVhbihyZXRlbmNpb24pKQ0KDQpicmVudF9yZW50ZW5jaW9uXzE0IDwtICBicmVudF9kYWlseSAlPiUNCiAgIGZpbHRlcihhbmlvICVpbiUgYyggMjAxNDoyMDE1KSwgZmVjaGEgPiAiMjAwNy0xMS0wMiIgKSAlPiUNCiAgbXV0YXRlKHJldGVuY2lvbiA9IGNhc2Vfd2hlbihicmVudF9zcG90ID49IDcxIH4gKGJyZW50X3Nwb3QgLSA3MCkvNzAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlbnRfc3BvdCA8IDcxIH4gMC4wMSkpICU+JSANCiAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKGJyZW50X3Nwb3QgPSBtZWFuKGJyZW50X3Nwb3QpLA0KICAgICAgICAgICAgcmV0ZW5jaW9uID0gIG1lYW4ocmV0ZW5jaW9uKSkNCiAgDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1ByZWNpbyBkZSBleHBvcnRhY2lvbiB5IHJlZmVyZW5jaWEuIE1lcmdlIGRlIGJhc2VzDQpwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvIDwtICBwcmVjaW9fZXhwb19jcnVkbyAgJT4lICAgDQogIGZ1bGxfam9pbihicmVudCApJT4lICNzZWxlY3QoLWRpZikpICU+JSANCiAgbGVmdF9qb2luKHd0aV9FSUEgKSAlPiUgDQogIGZ1bGxfam9pbih3dGlfZnJlZCkgJT4lIA0KICBtdXRhdGUocHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMgPSBjYXNlX3doZW4ocHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMgPiAzMDAgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBwcmVjaW9fZXhwb19jcnVkb19pbmRlYyksDQogICAgICAgICBwcmVjaW9fbWVfY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyAlaW4lIDE5OTM6MjAwMSB8IGFuaW8gJWluJSAyMDA0OjIwMTQgfiBwcmVjaW9fZXhwb19tZWNvbl9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvICVpbiUgMjAwMjoyMDAzIH4gcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTQgfiBwcmVjaW9fZXhwb19yZWdhbGlhc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvKSB+IGJyZW50X2hpc3RvcmljLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPCAxOTkzIH4gcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX21lX2NydWRvLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCg0KIyB3cml0ZS5jc3YocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywNCiMgICAgICAgICAgICAgICAgICAgICBmaWxlID0gIi4uL3Jlc3VsdGFkb3MvcHJlY2lvX2V4cG9feV9tZG9fbXVuZGlhbF9jcnVkby5jc3YiLHJvdy5uYW1lcyA9IEYpDQoNCnByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByZWNpb19tZV9jcnVkbykNCg0KDQoNCmBgYA0KDQojIyMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgR2FzDQoNCg0KIyMjIyMgRXhwb3J0YWNpw7NuIEFyZ2VudGluYQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFByZWNpbyBkZSBFeHBvcnRhY2nDs24gZGVsIEdhcyANCiNyZWdhbGlhcw0KcHJlY2lvX2V4cG9fcmVnYWxpYXNfZ2FzIDwtIHJlYWRfZGVsaW0oIi4uL2RhdGEvc2VjcmV0YXJpYV9lbmVyZ2lhL3JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2V4dGVybm9fZ2FzX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfY3VlbmNhID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIiwNCiAgICAgICAgICBhbmlvID0gbmEubG9jZihhbmlvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAiY3VlbmNhIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQsIGN1ZW5jYSkgJT4lDQogIG11dGF0ZSh2YWxvciA9IGdzdWIoIiwiLCAiIiwgdmFsb3IpLA0KICAgICAgICAgdmFsb3IgPSBhcy5kb3VibGUodmFsb3IpKSAlPiUgIA0KICBzdW1tYXJpc2UocHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzID0gbWVhbih2YWxvciwgbmEucm0gPSBUKSkgJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBleHRlcm5vIikgJT4lDQogIGZpbHRlcihjdWVuY2EgPT0gInRvdGFsX2N1ZW5jYSIpJT4lDQogIGFycmFuZ2UoYW5pbykNCg0KI2NvbXRyYWRlDQpleHBvX2dhc19jb210cmFkZSA8LSByZWFkX2NzdigiLi4vZGF0YS91bl9jb210cmFkZS9leHBvX2dhc19zaXRjLmNzdiIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSkgJT4lIA0KICBtdXRhdGUoZXhwb19wcmVjaW9fTU1CVFUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKGV4cG9fcHJlY2lvX01tMyApLA0KICAgICAgICAgZXhwb19wcmVjaW9fTW0zX2FycyA9IGV4cG9fcHJlY2lvX01tMyAqIHRjYykgDQoNCiNtZXJnZSBkZSBiYXNlcw0KI3ByZWNpbyBlbiBwZXNvcw0KcHJlY2lvX2V4cG9fZ2FzIDwtIGV4cG9fZ2FzX2NvbXRyYWRlICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHBvX2dhc19jb210cmFkZSA9IGV4cG9fcHJlY2lvX01tM19hcnMpICU+JSANCiAgZnVsbF9qb2luKHByZWNpb19leHBvX3JlZ2FsaWFzX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtYyhjdWVuY2EsIHRpcG9fcHJlY2lvKSkpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvX2V4cG9faW5kZWMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfZ2FzLCBwcmVjaW9fZXhwb19nYXNfaW5kZWMpICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCEoaXMubmEocHJlY2lvX2V4cG9fZ2FzX2luZGVjKSkpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19leHBvX2dhc19tZWNvbiA9IHByZWNpb19nYXNfbWVfcGVzb3NfTW0zKSkNCg0KDQojcHJlY2lvcyBlbiBkb2xhcmVzDQpwcmVjaW9fZXhwb19nYXNfdXNkIDwtIGV4cG9fZ2FzX2NvbXRyYWRlICAlPiUgIA0KICBzZWxlY3QoYW5pbywgIHByZWNpb19leHBvX2dhc19jb210cmFkZSA9IGV4cG9fcHJlY2lvX01NQlRVKSAlPiUNCiAgbGVmdF9qb2luKCBwcmVjaW9fZXhwb19nYXMgJT4lIHNlbGVjdCgtYyhwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUsIHVuaWRhZCkpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICU+JQ0KICBtdXRhdGUocHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzID0gKHByZWNpb19leHBvX2dhc19yZWdhbGlhcy8xMDAwKSAvIFRDQywgDQogICAgICAgICBwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSAocHJlY2lvX2V4cG9fZ2FzX2luZGVjICkvIFRDQywgDQogICAgICAgICBwcmVjaW9fZXhwb19nYXNfbWVjb24gPSAocHJlY2lvX2V4cG9fZ2FzX21lY29uLzEwMDApLyBUQ0MsDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01NQlRVIikgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19nYXNfcmVnYWxpYXMiLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIiwgInByZWNpb19leHBvX2dhc19tZWNvbiIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9wKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLiksLVRDQykNCg0KDQpgYGANCg0KIyMjIyMgUmVmZXJlbmNpYXMgbXVuZGlhbGVzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUHJlY2lvIFJlZmVyZW5jaWEgTWVyY2FkbyBFeHRlcm5vIEdhcyANCiMjIyMgUHJlY2lvcyBNdW5kaWFsZXMNCiNoZW5yeV9odWIgRUlBDQpoZW5yeV9odWIgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9laWEvUk5HV0hIRGQueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JSANCiAgcmVuYW1lKCBkYXRlID0gRGF0ZSwNCiAgICBoZW5yeV9odWJfc3BvdCA9IGBIZW5yeSBIdWIgTmF0dXJhbCBHYXMgU3BvdCBQcmljZSAoRG9sbGFycyBwZXIgTWlsbGlvbiBCdHUpYCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9NTUJUVSIsDQogICAgICAgICBhbmlvID0geWVhcihkYXRlKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKGVpYV9oZW5yeV9odWJfc3BvdCA9IG1lYW4oaGVucnlfaHViX3Nwb3QsIG5hLnJtID0gVCkpIA0KDQpoZW5yeV9odWJfYXJzIDwtICBoZW5yeV9odWIgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIFRDQykpICU+JSANCiAgbXV0YXRlKGhlbnJ5X2h1Yl9zcG90ID0gY29udmVyc29yX01NQlRVbTNnYXNfcChlaWFfaGVucnlfaHViX3Nwb3QgKjEwMDAqVENDKSwNCiAgICAgICAgIHVuaWRhZD0gImFycy9NaWxlcyBkZSBtMyIpDQoNCiMgUHJlY2lvIFVTQSBib2NhIGRlIHBvem8gRUlBICAgICAgICAgIHVuaWRhZCA9ICJVU0QvZnQzIg0Kd2VsbGhlYWRfcHJpY2VfZWV1dSA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL2VpYS9uYXR1cmFsX2dhc193ZWxsaGVhZF9wcmljZV9lZXV1LnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSh1c193ZWxsaGVhZF9wcmljZV9mdDMgPSAiVS5TLiBOYXR1cmFsIEdhcyBXZWxsaGVhZCBQcmljZSAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldCkiKSAlPiUgIA0KICBtdXRhdGUoIHVzX3dlbGxoZWFkX3ByaWNlX01tMyA9IGNvbnZlcnNvcl9mdDNtM19wKHVzX3dlbGxoZWFkX3ByaWNlX2Z0MyoxMDAwKSwNCiAgICAgICAgICB1c193ZWxsaGVhZF9wcmljZV9NTUJUVSA9IGNvbnZlcnNvcl9mdDNNTUJUVV9wKHVzX3dlbGxoZWFkX3ByaWNlX2Z0My8xMDAwKSwNCiAgICAgICAgICBhbmlvID0geWVhcihEYXRlKSwNCiAgICAgICAgIHVuaWRhZCAgPSAiVVNEIikgDQoNCiNvdHJvcyBwcmVjaW9zIGRlIFVTQSBFSUENCnByaWNlX2VldXUgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9laWEvbmF0dXJhbF9nYXNfcHJpY2VzX3VzYS54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lIA0KICByZW5hbWUodXNfd2VsbGhlYWRfZ2FzX3ByaWNlID0gYFUuUy4gTmF0dXJhbCBHYXMgV2VsbGhlYWQgUHJpY2UgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2ltcG9ydF9nYXNfcHJpY2UgPSBgUHJpY2Ugb2YgVS5TLiBOYXR1cmFsIEdhcyBJbXBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19waXBlbGluZV9pbXBvcnRfcHJpY2UgPSBgVS5TLiBOYXR1cmFsIEdhcyBQaXBlbGluZSBJbXBvcnRzIFByaWNlIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19sbmdfaW1wb3J0X3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgTE5HIEltcG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2V4cG9ydF9nYXNfcHJpY2UgPSBgUHJpY2Ugb2YgVS5TLiBOYXR1cmFsIEdhcyBFeHBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19leHBvcnRfZ2FzX3BpcGVsaW5lX3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgUGlwZWxpbmUgRXhwb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfZXhwb3J0X2xuZ19wcmljZSA9IGBQcmljZSBvZiBMaXF1ZWZpZWQgVS5TLiBOYXR1cmFsIEdhcyBFeHBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWApICU+JSANCiAgc2VsZWN0KHVzX3dlbGxoZWFkX2dhc19wcmljZSwgdXNfaW1wb3J0X2dhc19wcmljZSwgdXNfcGlwZWxpbmVfaW1wb3J0X3ByaWNlLA0KICAgICAgICB1c19sbmdfaW1wb3J0X3ByaWNlLCB1c19leHBvcnRfZ2FzX3ByaWNlLA0KICAgICAgICB1c19leHBvcnRfZ2FzX3BpcGVsaW5lX3ByaWNlLCB1c19leHBvcnRfbG5nX3ByaWNlICkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDE5MjI6MjAxOSkNCiAgDQoNCnByaWNlX2VldXVfTW0zIDwtICBwcmljZV9lZXV1ICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KXtjb252ZXJzb3JfZnQzbTNfcCggMTAwMCl9KSAlPiUgDQogIG11dGF0ZShhbmlvID0gMTkyMjoyMDE5LA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NaWxlcyBkZSBtMyIpIA0KDQpwcmljZV9lZXV1X01NQlRVIDwtICBwcmljZV9lZXV1ICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KXtjb252ZXJzb3JfZnQzTU1CVFVfcCh4IC8xMDAwKX0pICU+JSANCiAgbXV0YXRlKGFuaW8gPSAxOTIyOjIwMTksDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01NQlRVIikgICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQoNCiNldXJvc3RhdA0KDQoNCiNCUA0KYnBfZ2FzX3ByaWNlcyA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL2JwL2JwLXN0YXRzLXJldmlldy0yMDIwLWFsbC1kYXRhLnhsc3giLCANCiAgICBzaGVldCA9ICJHYXMgLSBQcmljZXMgIiwgc2tpcCA9IDMpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAuLi4xLCANCiAgICAgICAgIGJwX2xuZ19qYXBhbl9jaWYgPSBKYXBhbiwNCiAgICAgICAgIGJwX2xuZ19qa20gPSAiSmFwYW4gS29yZWEgTWFya2VyIiwNCiAgICAgICAgIGJwX2dhc19nZXJtYW5faW1wb3J0X3ByaWNlID0gIkF2ZXJhZ2UgR2VybWFuIiwNCiAgICAgICAgIGJwX2dhc19uYnAgPSBVSywNCiAgICAgICAgIGJwX2dhc19uZXRoZXJsYW5kc190dGYgPSAiTmV0aGVybGFuZHMgVFRGIiwNCiAgICAgICAgIGJwX2dhc19oZW5yeV9odWIgPSBVUywNCiAgICAgICAgIGJwX2dhc19jYW5hZGEgPSBDYW5hZGEsIA0KICAgICAgICAgYnBfb2lsX21peF9tZWFuX29lY2QgPSBPRUNEKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQpicF9nYXNfMjAxNiA8LSBicF9nYXNfcHJpY2VzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGJwX2xuZ19qa20sIGJwX2dhc19oZW5yeV9odWIsIGJwX2dhc19uZXRoZXJsYW5kc190dGYgKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhbmlvID09IDIwMTYpDQoNCg0KI0ZNSQ0KZm1pX3ByaWNlcyA8LSByZWFkX2NzdigiLi4vZGF0YS9mbWkvUENQU18wOS0xNi0yMDIwIDE1LTA3LTEwLTY2X3RpbWVTZXJpZXMuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMzggPSBjb2xfc2tpcCgpKSkNCg0KZm1pX2dhc19wcmljZSA8LSBmbWlfcHJpY2VzICU+JSANCiAgZmlsdGVyKGBDb21tb2RpdHkgTmFtZWAgJWluJSBjKCJOYXR1cmFsIGdhcywgRVUiLCJOYXR1cmFsIEdhcywgVVMgSGVucnkgSHViIEdhcyIsIkxORywgQXNpYSIgICksDQogICAgICAgICBgVW5pdCBOYW1lYCA9PSAiSW5kZXgiKSAlPiUgDQogIHJlbmFtZShjb21tb2RpdHkgPSAiQ29tbW9kaXR5IE5hbWUiLA0KICAgICAgICAgdW5pZGFkID0gIlVuaXQgTmFtZSIpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICAgIDg6bmNvbCguKSkgJT4lIA0KICBzZWxlY3QoY29tbW9kaXR5LCBhbmlvLCB2YWxvciwgdW5pZGFkICkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIDEwMCwNCiAgICAgICAgIGFuaW8gPSBhcy5kb3VibGUoYW5pbykpICU+JSANCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBjb21tb2RpdHksIA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikgJT4lIA0KICByZW5hbWUoZm1pX2xuZ19hc2lhID0gIkxORywgQXNpYSIsDQogICAgICAgICBmbWlfbmF0dXJhbF9nYXNfZXUgPSJOYXR1cmFsIGdhcywgRVUiLA0KICAgICAgICAgZm1pX2hlbnJ5X2h1YiA9ICJOYXR1cmFsIEdhcywgVVMgSGVucnkgSHViIEdhcyIpICU+JSANCiAgbXV0YXRlKGZtaV9sbmdfYXNpYSA9IGZtaV9sbmdfYXNpYSAqIGJwX2dhc18yMDE2JGJwX2xuZ19qa20sDQogICAgICAgICBmbWlfaGVucnlfaHViID0gIGZtaV9oZW5yeV9odWIgKiBicF9nYXNfMjAxNiRicF9nYXNfaGVucnlfaHViLA0KICAgICAgICAgZm1pX25hdHVyYWxfZ2FzX2V1ID0gZm1pX25hdHVyYWxfZ2FzX2V1ICogYnBfZ2FzXzIwMTYkYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQoNCiMgdW5pcXVlKGZtaV9wcmljZXMkYENvbW1vZGl0eSBOYW1lYCkNCiMgdW5pcXVlKGZtaV9wcmljZXMkYFVuaXQgTmFtZWApDQojIHVuaXF1ZShmbWlfcHJpY2VzJGBDb3VudHJ5IE5hbWVgKQ0KYGBgDQoNCg0KIyMjIyMgQm9saXZpYQ0KIA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyMjIyBQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIEJvbGl2aWENCiNQcmVjaW8gaW1wbyBib2xpdmlhIHJldmlzdGEgSURFRQ0KI3ByZWNpbyBib2xpdmlhIHZzIHByZWNpb3MgaW50ZXJub3MNCmN1YWRyb180LjMgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9pZGVlL1ByZWNpb3MgZGVsIGdhcyBuYXR1cmFsIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg4Lnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSwgc2hlZXQgPSAzKSAlPiUNCiAgcmVuYW1lKHVuaWRhZF9nYXMgPSAidW5pZGFkIGdhcyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9nYXMgPSAicGVzb3MgZGUgMTk3MC8xMDAwIG0zIiApDQoNCnByZWNpb19pZGVlX2ltcG9fZ2FzIDwtIGN1YWRyb180LjMgICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9nYXMsIHByZWNpb19nYXNfYm9saXZpYSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzcwKSkgJT4lDQogIG11dGF0ZShwcmVjaW9fZ2FzX2JvbGl2aWFfaWRlZSA9IHByZWNpb19nYXNfYm9saXZpYSAqIGlwY183MCAvIGNvbnZlcnNvcl9wZXNvcyRgJExleWAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUgPSBwcmVjaW9fZ2FzX2JvbGl2aWFfaWRlZSAvdGNjKQ0KDQoNCiNwcmVjaW8gQm9saXZpYSBZUEZCIGVuIFVTRCAob3JpZ2luYWwpDQojIGEgbTMNCnByZWNpb19leHBvX2JvbGl2aWFfdXNkX3lwZmIgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS95cGZiL3ByZWNpb19leHBvX2JvbGl2aWEueGxzeCIpICU+JQ0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMiLCAicHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzIiksDQogICAgICAgICAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfZnQzbTNfcCh4KX0pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvTWlsZXMgZGUgbTMiKQ0KDQoNCiMgYSBNTSBCVFUNCnByZWNpb19leHBvX2JvbGl2aWFfdXNkX01NQlRVX3lwZmIgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS95cGZiL3ByZWNpb19leHBvX2JvbGl2aWEueGxzeCIpICU+JQ0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMiLCAicHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzIiksDQogICAgICAgICAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfZnQzTU1CVFVfcCh4LzEwMDApfSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9NTUJUVSIpICU+JSANCiAgcmVuYW1lKHByZWNpb19leHBvX2JvbGl2aWFfYXJnX3lwZmIgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMsDQogICAgICAgICBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF95cGZiID0gcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzKSAgDQoNCg0KI3ByZWNpbyBib2xpdmlhIGVuIHBlc29zIA0KI3N1bWFybGUgZWwgZmxldGUgPSAwLjAyNDEyOTc5NA0KcHJlY2lvX2V4cG9fYm9saXZpYV9wZXNvc195cGZiIDwtICBwcmVjaW9fZXhwb19ib2xpdmlhX3VzZF95cGZiICU+JSANCiAgICBsZWZ0X2pvaW4odGNwX2FudWFsKSAlPiUNCiAgbXV0YXRlKHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhc19wZXNvcyA9IHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcyAqIFRDQyAsIA0KICAgICAgICAgcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzX3Blc29zID0gcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzICogVENDLA0KICAgICAgICAgdW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpDQoNCg0KI3ByZWNpbyBpbXBvIGRlIGFyZ2VudGluYSBkZXNkZSBib2xpdmlhIFVOIENvbXRyYWRlDQpnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlX3VzZCA8LSByZWFkX2NzdigiLi4vZGF0YS91bl9jb210cmFkZS9nYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlLmNzdiIpICU+JQ0KICBzZWxlY3QoUGVyaW9kLCAiVHJhZGUgRmxvdyIsIFJlcG9ydGVyLCBQYXJ0bmVyLCAiQ29tbW9kaXR5IENvZGUiLCBDb21tb2RpdHksDQogICAgICAgICBRdHksIHRyYWRlX3ZhbHVlX3VzZCwgcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEsIHVuaWRhZF9wcmVjaW8sIHVuaWRhZF9jYW50aWRhZCkgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCkgJT4lIA0KICBtdXRhdGUocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKHByZWNpb19pbXBvX2dhc19ib2xpdmlhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQojcGFzYWplIGEgcGVzb3MNCmdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGUgPC0gZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZV91c2QgICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEgPSBwcmVjaW9faW1wb19nYXNfYm9saXZpYSAqIHRjYywNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KDQojcHJlY2lvIGV4cG8gYm9saXZpYSBVTiBDT01UUkFERQ0KZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZV91c2QgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdW5fY29tdHJhZGUvZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZS5jc3YiKSAlPiUNCiAgc2VsZWN0KFBlcmlvZCwgIlRyYWRlIEZsb3ciLCBSZXBvcnRlciwgUGFydG5lciwgIkNvbW1vZGl0eSBDb2RlIiwgQ29tbW9kaXR5LA0KICAgICAgICAgUXR5LCB0cmFkZV92YWx1ZV91c2QsIHByZWNpb19leHBvX2dhc19ib2xpdmlhLCB1bmlkYWRfcHJlY2lvLCB1bmlkYWRfY2FudGlkYWQpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QpICU+JSANCiAgIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfTU1CVFVfY29tdHJhZGUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKHByZWNpb19leHBvX2dhc19ib2xpdmlhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQojcGFzYWplIGEgcGVzb3MNCmdhc19leHBvX2JvbGl2aWFfY29tdHJhZGUgPC0gIGdhc19leHBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICU+JQ0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfYm9saXZpYSA9IHByZWNpb19leHBvX2dhc19ib2xpdmlhICogdGNjLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KYGBgDQoNCiMjIyMjIFRvZG9zIGxvcyBwcmVjaW9zDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1ByZWNpbyBkZSBleHBvcnRhY2lvbiB5IHJlZmVyZW5jaWEgZGUgR2FzLiBNZXJnZSBkZSBiYXNlcw0KDQojcHJlY2lvcyBlbiB1c2QNCnByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSA8LSBwcmljZV9lZXV1X01NQlRVICU+JSANCiAgbGVmdF9qb2luKCAgaGVucnlfaHViKSAlPiUNCiAgbGVmdF9qb2luKGJwX2dhc19wcmljZXMpICU+JSANCiAgbGVmdF9qb2luKGZtaV9nYXNfcHJpY2UpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2JvbGl2aWFfdXNkX01NQlRVX3lwZmIpICU+JSANCiAgbGVmdF9qb2luKGdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2ltcG9fZ2FzX2FyZ19ib2xpdmlhX2NvbXRyYWRlID0gcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUpKSAlPiUgDQogIGxlZnRfam9pbihnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlX3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfYXJnX2NvbXRyYWRlID0gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfYXJnX01NQlRVX2NvbXRyYWRlKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2lkZWVfaW1wb19nYXMgJT4lIHNlbGVjdChhbmlvLCBwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fZXhwb19nYXNfdXNkKSAlPiUgDQogIG11dGF0ZShwcmVjaW9faW1wb19nYXNfYm9saXZpYV9pZGVlID0gY29udmVyc29yX20zTU1CVFVfcChwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUvMTAwMCksI29rDQogICAgICAgICBwcmVjaW9fZXh0ZXJub19nYXMgPSBjYXNlX3doZW4oIGFuaW8gPCAxOTY2IH4gcHJlY2lvX2ltcG9fZ2FzX2FyZ19ib2xpdmlhX2NvbXRyYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUfiBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfY29tdHJhZGUpLA0KICAgICAgICAgcHJlY2lvX2V4cG9ydGFjaW9uX2dhc19hciA9IGNhc2Vfd2hlbihhbmlvIDwxOTk5IH5wcmVjaW9fZXhwb19nYXNfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5OSB+IHByZWNpb19leHBvX2dhc19yZWdhbGlhcykpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4dGVybm9fZ2FzLCBldmVyeXRoaW5nKC4pLCAtcHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lDQogIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgbXV0YXRlX2FsbChjb252ZXJzb3JfTU1CVFViZXBfcCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9iZXAiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQoNCmNvbXBhcmFjaW9uX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiAgICAjIHNlbGVjdChhbmlvLCBwcmVjaW9fZXh0ZXJub19nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBicmVudF9oaXN0b3JpYywgd3RpX3Nwb3RfcHJpY2VfZnJlZCwNCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8pKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL2JlcCIpDQogIA0KIyBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTW0zIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUNCiMgICBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiMgICBtdXRhdGVfYWxsKGNvbnZlcnNvcl9tM01NQlRVX3ApICU+JSANCiMgICBtdXRhdGUodW5pZGFkID0gIlVTRC9iZXAiKSAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQojIHdyaXRlLmNzdihwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUsIGZpbGUgPSAiLi4vcmVzdWx0YWRvcy9kYXRhX3Zpei9wcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUuY3N2IiwNCiMgICAgICAgICAgIHJvdy5uYW1lcyA9IEYpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KE1NQlRVID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIEJFUCA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19iZXApLCBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX21kb19tdW5kaWFsX2dhcy54bHN4IikNCg0KI2dyYWZpY28gcHJlY2lvcyBiZXANCiMgZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfZ2FzX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiMgICBzZWxlY3QoLXByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KIyAgIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMzpuY29sKC4pKSAlPiUNCiMgICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwgInByZWNpb19pbXBvX2dhc19ib2xpdmlhX01NQlRVX2NvbXRyYWRlIiwNCiMgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlIiwgInByZWNpb19leHBvX2dhc19pbmRlYyIpKSkgJT4lDQojICAgZmlsdGVyKCEodGlwb19wcmVjaW8gJWluJSBjKCJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JSANCiMgICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID0gdGlwb19wcmVjaW8pKSsNCiMgICBnZW9tX2xpbmUoKSArDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnMoeSA9ICJVU0QvYmVwIikNCiMgcGxvdGx5OjpnZ3Bsb3RseShncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9nYXNfYmVwKQ0KDQoNCg0KDQojcHJlY2lvcyBlbiBhcnMuIElOQ09NUExFVE8NCnByZWNpb19leHBvX3lfbWVfZ2FzIDwtIHByZWNpb19leHBvX2dhcyAlPiUNCiAgZnVsbF9qb2luKHByZWNpb19pZGVlX2ltcG9fZ2FzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2dhc19ib2xpdmlhX2lkZWUpKSAlPiUgDQogIGZ1bGxfam9pbihwcmVjaW9fZXhwb19ib2xpdmlhX3Blc29zX3lwZmIgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCANCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19ib2xpdmlhX3lwZmIgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXNfcGVzb3MgKSkgJT4lIA0KICBmdWxsX2pvaW4oZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHJlY2lvLA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfY29tdHJhZGUgPSBwcmVjaW9faW1wb19nYXNfYm9saXZpYSApKSAlPiUgDQogIGxlZnRfam9pbihnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcmVjaW8sIA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfY29tdHJhZGUgPSBwcmVjaW9fZXhwb19nYXNfYm9saXZpYSApKSAlPiUNCiAgbGVmdF9qb2luKGhlbnJ5X2h1YikgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fZXhwb195X21lX2dhcywgcGF0aCA9ICJwcmVjaW9fZXhwb195X21kb19tdW5kaWFsX2dhcy54bHN4IikNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChjb21wYXJhY2lvbl9iZXAsIHBhdGggPSAiY29tcGFyYWNpb25fYmVwLnhsc3giKQ0KDQoNCmNvbXBhcmFjaW9uX3ByZWNpb3MgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2dhc19tZG9pbnQpKQ0KIA0KYGBgDQoNCg0KDQpgYGB7cn0NCnByZWNpb19jcnVkb192c19nYXMgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogICAgICAgICAgICAgIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpb19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlICAgPSBwcmVjaW9fY3J1ZG9fdXNkX2JibCwNCiAgICAgICAgICAgICAgICAgICAgIDI6bmNvbCguKSksIGJ5ID0iYW5pbyIpICU+JSANCiAgbXV0YXRlKHByZWNpb19jcnVkb19zb2JyZV9nYXMgPXByZWNpb19jcnVkb191c2RfYmJsL3ByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBmaWx0ZXIoIShpcy5uYShwcmVjaW9fY3J1ZG9fc29icmVfZ2FzKSksIA0KICAgICAgICAgISh0aXBvX3ByZWNpb19jcnVkbyAlaW4lIGMoInd0aV9zcG90X3ByaWNlX2ZyZWQiLCAicHJlY2lvX21lX2NydWRvIikpICApDQogICAgICAgICAjICh0aXBvX3ByZWNpb19jcnVkbyAlaW4lIGMoImJyZW50X2llYSIpKSAgKQ0KICAgICAgICAgIyAodGlwb19wcmVjaW9fY3J1ZG8gJWluJSBjKCJicmVudF9pZWEiLCAiYnJlbnRfaGlzdG9yaWMiKSkgICkNCnByZWNpb19jcnVkb192c19nYXMNCg0KIyBncmFmIDwtICBwcmVjaW9fY3J1ZG9fdnNfZ2FzICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHByZWNpb19jcnVkb19zb2JyZV9nYXMsIGNvbG9yPXRpcG9fcHJlY2lvX2NydWRvKSkrDQojICAgZ2VvbV9saW5lKCkrDQojICAgbGFicyh0aXRsZSA9ICJwcmVjaW8gZGVsIGNydWRvIHNvYnJlIGVsIGRlbCBnYXMgKGFtYm9zIGVuIGJhcnJpbGVzKSIpDQoNCiMgZ2dwbG90bHkoZ3JhZiwgd2lkdGggPSA4MDAsIGxlbmd0aD02MDApDQojIGdyYWYNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19jcnVkb192c19nYXMsIHBhdGg9ICJwcmVjaW8gZGVsIGNydWRvIHZzIGdhcy54bHN4IikgIA0KYGBgDQoNCg0KDQojIyBFeHBvcnRhY2lvbmVzIGUgSW1wb3J0YWNpb25lcw0KDQojIyMjIEV4cG9ydGFjaW9uZXMgZSBJbXBvcnRhY2lvbmVzIGRlIENydWRvDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgU0VTQ08NCiNjYW50aWRhZGVzLiBwb3N0IDIwMTAgKGhhc3RhIDIwMTkpDQppbXBvcnRhY2lvbmVzX2V4cG9ydGFjaW9uZXMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvc2VjcmV0YXJpYV9lbmVyZ2lhL3Nlc2NvL2ltcG9ydGFjaW9uZXMtZXhwb3J0YWNpb25lcy5jc3YiKQ0KDQojIGNhbnRpZGFkZXMuIHBvc3QgMjAxNiANCmltcG9ydGFjaW9uZXNfZXhwb3J0YWNpb25lc19wb3N0MjAxNiA8LSByZWFkX2NzdigiLi4vZGF0YS9zZWNyZXRhcmlhX2VuZXJnaWEvc2VzY28vaW1wb3J0YWNpb25lcy1leHBvcnRhY2lvbmVzLWEtcGFydGlyLWRlbC0yMDE2LS5jc3YiKQ0KDQojIyMjY29tZXJjaW8gZXh0ZXJpb3IgcG9zdCAyMDEwOiAiVERfY29tZXJjaW9fZXh0ZXJpb3IueGxzeCINCmNvbWV4X3Bvc3QyMDEwIDwtIHJlYWRfZGVsaW0oIi4uL2RhdGEvc2VjcmV0YXJpYV9lbmVyZ2lhL3Nlc2NvL2NvbWV4X3Bvc3QyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDUpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9IGNhc2Vfd2hlbihEYXRvcyA9PSAiU3VtYSBkZSBtb250byIgfiAiVVNEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSwNCiAgICAgICAgIAl1bmlkYWQgPSBzdHJfcmVtb3ZlX2FsbCgJdW5pZGFkLCAiWygpXSIgKSwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSkgJT4lICANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICByZW5hbWUoZXhwb3J0YWNpb24gPSAiRXhwb3J0YWNpw7NuIiwNCiAgICAgICAgIGltcG9ydGFjaW9uID0gIkltcG9ydGFjacOzbiIpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBhbmlvLCBtZXMsIGV2ZXJ5dGhpbmcoLiksIC1jKCJUb3RhbCBnZW5lcmFsIiwgRGF0b3MpKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNjo3KQ0KDQoNCiMjI2V4cG9ydGFjaW9uZXMgcHJlIDIwMTA6ICJFeHBvcnRhY2lvbmVzLnhsc3giDQpleHBvX3ByZTIwMTAgPC0gcmVhZF9kZWxpbSgiLi4vZGF0YS9zZWNyZXRhcmlhX2VuZXJnaWEvc2VzY28vZXhwb19wcmUyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIG1lcyA9ICJNZXMiLA0KICAgICAgICAgcHJvZHVjdG8gPSBQcm9kdWN0bywNCiAgICAgICAgIHZhbG9yID0gVG90YWwpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBtZXMgPSB6b286Om5hLmxvY2YobWVzKSwNCiAgICAgICAgIHByb2R1Y3RvID0gem9vOjpuYS5sb2NmKHByb2R1Y3RvKSwNCiAgICAgICAgIHZhcmlhYmxlID0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KERhdG9zLCAiTTMiKSB+ICJtMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIlRvbiIpIH4gInRvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIkZPQiIpIH4gIlVTRCIpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZXZlcnl0aGluZyguKSwgLWMoRGF0b3MpKQ0KDQojbm8gc2UgZGUgZG9uZGUgc2FsacOzIGVzdGUgcGVybyBoYWJyaWEgcSByYXN0cmVhcmxvDQpleHBvX3VzZF90b24gPC0gcmVhZF9kZWxpbSgiLi4vZGF0YS9zZWNyZXRhcmlhX2VuZXJnaWEvc2VzY28vZXhwb191c2RfdG9uLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDMpDQoNCiMjI2ltcG9ydGFjaW9uZXMgcHJlIDIwMTA6ICJJbXBvcnRhY2lvbmVzLnhsc3giDQppbXBvX3ByZTIwMTAgPC0gcmVhZF9kZWxpbSgiLi4vZGF0YS9zZWNyZXRhcmlhX2VuZXJnaWEvc2VzY28vaW1wb19wcmUyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIG1lcyA9ICJNZXMiLA0KICAgICAgICAgcHJvZHVjdG8gPSBQcm9kdWN0bywNCiAgICAgICAgIHZhbG9yID0gVG90YWwpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBtZXMgPSB6b286Om5hLmxvY2YobWVzKSwNCiAgICAgICAgIHByb2R1Y3RvID0gem9vOjpuYS5sb2NmKHByb2R1Y3RvKSwNCiAgICAgICAgIHZhcmlhYmxlID0gImltcG9ydGFjaW9uIiwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KERhdG9zLCAiTTMiKSB+ICJtMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIlRvbiIpIH4gInRvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIkZPQiIpIH4gIlVTRCIpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZXZlcnl0aGluZyguKSwgLWMoRGF0b3MpKQ0KIyBpbXBvX3ByZTIwMTANCg0KDQojQmFzZSB1bmlkYSBkZSBTRVNDTw0KY29tZXJjaW9fZXh0ZXJpb3IgPC0gY29tZXhfcG9zdDIwMTAgJT4lIA0KICBiaW5kX3Jvd3MoaW1wb19wcmUyMDEwLCBleHBvX3ByZTIwMTApICU+JSANCiAgYXJyYW5nZShmZWNoYSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBjYXNlX3doZW4odW5pZGFkID09ICJtaWxlcy9tMyIgfiB2YWxvciAqIDEwMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFsb3IpLA0KICAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHVuaWRhZCA9PSAibWlsZXMvbTMiIH4gIm0zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSkNCg0KI2V4cG8gZSBpbXBvIGRlIENydWRvLiBjYW50aWRhZGVzIHkgdmFsb3INCmNvbWV4X2NydWRvX3Nlc2NvIDwtIGNvbWVyY2lvX2V4dGVyaW9yICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QocHJvZHVjdG8sICJQRVRST0xFTyIpIHwgc3RyX2RldGVjdChwcm9kdWN0bywgIkN1ZW5jYSIpLA0KICAgICAgICAgdW5pZGFkICE9ICJUb24iKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUgDQogIG11dGF0ZShwcm9kdWN0byA9ICJjcnVkbyIsDQogICAgICAgICB2YWxvciA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm0zIiB+IGNvbnZlcnNvcl9tM2JibF9xKHZhbG9yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvciksDQogICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4odW5pZGFkID09ICJtMyIgfiAiYmFycmlsZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB1bmlkYWQpKQ0KDQoNCiNxdcOpIHByb2R1Y3RvcyBlbnRyYW4gZW4gZWwgZmlsdHJvIGRlIGNydWRvPw0KIyB1bmlxdWUoKGNvbWVyY2lvX2V4dGVyaW9yICU+JSBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIlBFVFJPTEVPIikgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiQ3VlbmNhIikpKSRwcm9kdWN0bykNCg0KDQojTUVDT04NCmNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9tZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJDb20uIGV4dGVyaW9yIiwgc2tpcCA9IDcpICU+JQ0KICByZW5hbWUoYW5pbyA9ICcuLi4xJyAsDQogICAgICAgICBleHBvX01tM19jcnVkbyA9ICdFeHBvcnRhY2lvbmVzLi4uMicsDQogICAgICAgICBpbXBvX01tM19jcnVkbyA9ICdJbXBvcnRhY2lvbmVzLi4uMycsDQogICAgICAgICBzYWxkb19NbTNfY3J1ZG8gPSBgQmFsYW5jZSAoWC1NKS4uLjRgLA0KICAgICAgICAgZXhwb19NTW0zX2dhcyA9ICdFeHBvcnRhY2lvbmVzLi4uNScsDQogICAgICAgICBpbXBvX01tM19nYXMgPSAnSW1wb3J0YWNpb25lcy4uLjYnLA0KICAgICAgICAgc2FsZG9fTW0zX2dhcyA9IGBCYWxhbmNlIChYLU0pLi4uN2AsDQogICAgICAgICBleHBvX21ldGFsaWZlcm9zX290cm9zX01NdXNkID0gYE1pbmVyYWxlcyBtZXRhbMOtZmVyb3MsIGVzY29yaWFzIHkgY2VuaXphc2AsDQogICAgICAgICBleHBvX2NydWRvX01NdXNkID0gYFBldHLDs2xlbyBjcnVkb2AsDQogICAgICAgICBleHBvX2dhc19NTXVzZCA9IGBHYXMgZGUgcGV0csOzbGVvIHkgb3Ryb3MgaGlkcm9jYXJidXJvc2AsDQogICAgICAgICBleHBvX2NhcmJ1cmFudGVzX290cm9zX01NdXNkID0gYENhcmJ1cmFudGVzLCBncmFzYXMgeSBhY2VpdGVzIGx1YnJpY2FudGVzYCwNCiAgICAgICAgIGV4cG9fZWxlY3RyaWNhX01NdXNkID0gYEVuZXJnw61hIGVsw6ljdHJpY2FgLA0KICAgICAgICAgZXhwb19yZXN0b19jb21idXN0aWJsZXNfTU11c2QgPSBgUmVzdG8gZGUgY29tYnVzdGlibGVzYCkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW8gKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBtdXRhdGUoZXhwb19iYmxfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShleHBvX01tM19jcnVkbyoxMDAwKSwNCiAgICAgICAgIGltcG9fYmJsX2NydWRvID0gY29udmVyc29yX20zYmJsX3EoaW1wb19NbTNfY3J1ZG8qMTAwMCksDQogICAgICAgICBzYWxkb19iYmxfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShzYWxkb19NbTNfY3J1ZG8qMTAwMCkpDQoNCg0KI0lOREVDIC0gQ29tRXgNCiNjYW50aWRhZGVzDQpjYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvaW5kZWMvY2FudGlkYWRlc19leHBvX2hpZHJvX2luZGVjLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICByZW5hbWUoZXhwb19pbmRlY19jcnVkbyA9IHBldHJvbGVvX2NydWRvX2V4cG8sDQogICAgICAgICAgIGV4cG9faW5kZWNfZ2FzICA9IGdhc19uYXR1cmFsX2V4cG8pDQoNCiN2YWxvcg0KZXhwb19oaWRyb192YWxvcl9pbmRlYyA8LSByZWFkX2NzdigiLi4vZGF0YS9pbmRlYy9leHBvX2hpZHJvX3ZhbG9yLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICByZW5hbWUoZXhwb19pbmRlY19jcnVkbyA9IHBldHJvbGVvX2NydWRvX2V4cG8sDQogICAgICAgICAgIGV4cG9faW5kZWNfZ2FzICA9IGdhc19uYXR1cmFsX2V4cG8pDQoNCg0KDQojTWVyZ2UgZGUgYmFzZXMNCiNDcnVkbyBleHBvIGNhbnRpZGFkDQpleHBvX3FfY3J1ZG8gPC0gY29tZXhfY3J1ZG9fc2VzY28gJT4lDQogIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iLA0KICAgICAgICAgdW5pZGFkID09ICJiYXJyaWxlcyIpICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCB2YWxvcikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICByZW5hbWUoZXhwb19zZXNjb19jcnVkbyA9IHZhbG9yKSAlPiUgDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fbWVjb25fY3J1ZG8gPSBleHBvX2JibF9jcnVkbykpICU+JSANCiAgbGVmdF9qb2luKGNhbnRpZGFkZXNfZXhwb19oaWRyb19pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtZXhwb19pbmRlY19nYXMpKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2NydWRvX3NpdGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX2NhbnRpZGFkLCBleHBvX2NvbXRyYWRlX2NydWRvID0gZXhwb19iYmwgKSkgJT4lIA0KICBtdXRhdGUoZXhwb19jcnVkbyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5OSAgfiBleHBvX2NvbXRyYWRlX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFuaW8gJWluJSAxOTk5OjIwMTQgfiBleHBvX21lY29uX2NydWRvICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk5IH4gZXhwb19zZXNjb19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShleHBvX3Nlc2NvX2NydWRvKSB+IGV4cG9fbWVjb25fY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBleHBvX3Nlc2NvX2NydWRvKSwNCiAgICAgICAgIHVuaWRhZCA9ICJiYXJyaWxlcyIpICU+JSAjLA0KICAgICAgICAgIyBkaWYgPSBleHBvX2NydWRvL2V4cG9faW5kZWNfY3J1ZG8gLSAxKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsZXhwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLXZhcmlhYmxlKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCg0KDQojIE1lcmdlIGNydWRvIFVTRA0KZXhwb191c2RfY3J1ZG8gPC0gY29tZXhfY3J1ZG9fc2VzY28gJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiAsIHVuaWRhZCA9PSAiVVNEIikgJT4lIA0KICByZW5hbWUoZXhwb19jcnVkb19zZXNjbyA9IHZhbG9yKSAlPiUNCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbykpICU+JSANCiAgbGVmdF9qb2luKGNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19jcnVkb19tZWNvbiA9IGV4cG9fY3J1ZG9fTU11c2QpKSAlPiUgDQogIGxlZnRfam9pbihleHBvX2hpZHJvX3ZhbG9yX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9faW5kZWNfY3J1ZG8pKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2NydWRvX3NpdGMgJT4lIA0KICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF92YWxvciwgZXhwb19jb210cmFkZV9jcnVkbyA9IGV4cG9fdXNkX2NvbXRyYWRlX2NydWRvKSkgJT4lDQogIG11dGF0ZShleHBvX2NydWRvX21lY29uID0gZXhwb19jcnVkb19tZWNvbiAqMTAwMDAwMCwNCiAgICAgICAgIGV4cG9fY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyA8MTk5NCB+IGV4cG9fY29tdHJhZGVfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5NCB+IGV4cG9fY3J1ZG9fc2VzY28pKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC1jKHZhcmlhYmxlLCBwcm9kdWN0bykpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHt4LzEwXjZ9KQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCh1c2QgPSBleHBvX3VzZF9jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIyBjYW50aWRhZGVzID0gZXhwb19xX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlY2lvX2V4cG9ydGFjaW9uX3lfcmVmZXJlbmNpYSA9IHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8pLCANCiAgICAgICAgICAgICAgICAgICAgIyBwYXRoID0gIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvcmVzdWx0YWRvcy9leHBvX2NydWRvLnhsc3giKQ0KDQoNCg0KIyB3cml0ZS5jc3YoZXhwb19xX2NydWRvLCBmaWxlID0gIi4uL3Jlc3VsdGFkb3MvZGF0YV92aXovZXhwb19xX2NydWRvLmNzdiIsIHJvdy5uYW1lcyA9IEYpDQojIHdyaXRlLmNzdihleHBvX3VzZF9jcnVkbywgZmlsZSA9ICIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L2V4cG9fdXNkX2NydWRvLmNzdiIsIHJvdy5uYW1lcyA9IEYpDQpgYGANCg0KDQoNCiMjIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMgZGUgR2FzDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNTRVNDTw0KY29tZXhfZ2FzIDwtIGNvbWVyY2lvX2V4dGVyaW9yICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QocHJvZHVjdG8sICJHQVMgTkFUVVJBTCIpIHwgc3RyX2RldGVjdChwcm9kdWN0bywgIkdhcyBOYXR1cmFsIikgDQogICAgICAgICB8IHN0cl9kZXRlY3QocHJvZHVjdG8sICJHYXMgZGUgUmVmaW5lcsOtYSIpLA0KICAgICAgICAgcHJvZHVjdG8gIT0gIkdhcyBOYXR1cmFsIExpY3VhZG8iLA0KICAgICAgICAgdW5pZGFkICE9ICJUb24iKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpJT4lIA0KICBtdXRhdGUocHJvZHVjdG8gPSAiZ2FzIikNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoY29tZXhfY3J1ZG9fc2VzY28gJT4lIGZpbHRlcih1bmlkYWQgPT0gIlVTRCIsIHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tZXhfY3J1ZG9fc2VzY28gJT4lIGZpbHRlcih1bmlkYWQgPT0gIlVTRCIsIHZhcmlhYmxlID09ICJpbXBvcnRhY2lvbiIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tZXhfZ2FzICU+JSBmaWx0ZXIodW5pZGFkID09ICJVU0QiLCB2YXJpYWJsZSA9PSAiaW1wb3J0YWNpb24iKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWV4X2dhcyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAiVVNEIiwgdmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIikpLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gImNvbWV4X3Nlc2NvLnhsc3giKQ0KDQojRXhwbyBnYXMgU0VTQ08gY2FudGlkYWRlcw0KZXhwb19zZXNjb19xX2dhcyA8LSBjb21leF9nYXMgICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIHVuaWRhZCA9PSAibTMiKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdCgtYyh2YXJpYWJsZSwgcHJvZHVjdG8pKSAlPiUNCiAgcmVuYW1lKGV4cG9fc2VzY29fZ2FzID0gdmFsb3IpICU+JQ0KICBtdXRhdGUoZXhwb19zZXNjb19nYXMgPSByZXBsYWNlX25hKGV4cG9fc2VzY29fZ2FzLCAwICksDQogICAgICAgICBleHBvX3Nlc2NvX2dhcyA9IGV4cG9fc2VzY29fZ2FzIC8gMTAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpDQoNCiNleHBvIHNlc2NvIGdhcyB2YWxvcg0KZXhwb19zZXNjb191c2RfZ2FzIDwtIGNvbWV4X2dhcyAgJT4lDQogIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iLA0KICAgICAgICAgdW5pZGFkID09ICJVU0QiKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdCgtYyh2YXJpYWJsZSwgcHJvZHVjdG8pKSAlPiUNCiAgcmVuYW1lKGV4cG9fc2VzY29fZ2FzID0gdmFsb3IpICU+JQ0KICBtdXRhdGUoZXhwb19zZXNjb19nYXMgPSByZXBsYWNlX25hKGV4cG9fc2VzY29fZ2FzLCAwICkpDQoNCg0KI2V4cG8gVU4gQ29tdHJhZGUNCmV4cG9fZ2FzX3NpdGMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdW5fY29tdHJhZGUvZXhwb19nYXNfc2l0Yy5jc3YiKSAgJT4lIA0KICByZW5hbWUodHJhZGVfdmFsdWVfdXNkID0gIlRyYWRlIFZhbHVlIChVUyQpIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRCIsDQogICAgICAgICBleHBvX01tMyA9IGV4cG9fTW0zIC8xMDAwLA0KICAgICAgICAgdW5pZGFkX2NhbnRpZGFkID0gICJNaWxlcyBkZSBtMyIpDQoNCg0KI01lcmdlIGNhbnRpZGFkZXMNCmV4cG9fcV9nYXMgPC0gIGV4cG9fc2VzY29fcV9nYXMgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkgJT4lIA0KICBsZWZ0X2pvaW4oY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19tZWNvbiA9IGV4cG9fTU1tM19nYXMpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIiwNCiAgICAgICAgICAgICAgICAgICAgIGV4cG9fZ2FzX21lY29uID0gZXhwb19nYXNfbWVjb24gKiAxMDAwKSApICU+JSANCiAgbGVmdF9qb2luKGNhbnRpZGFkZXNfZXhwb19oaWRyb19pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtZXhwb19pbmRlY19jcnVkbykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fZ2FzX3NpdGMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19jb210cmFkZSA9IGV4cG9fTW0zLCB1bmlkYWQgPSB1bmlkYWRfY2FudGlkYWQgKSkgJT4lIA0KICAjIG11dGF0ZShkaWYgPSBleHBvX3Nlc2NvX2dhcy8gZXhwb19pbmRlY19nYXMgLSAxICkgJT4lDQogIG11dGF0ZShleHBvX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5NyB+IGV4cG9fZ2FzX2NvbXRyYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMTk5NiB+ZXhwb19zZXNjb19nYXMgKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19nYXMsIGV2ZXJ5dGhpbmcoLikpDQoNCmV4cG9fcV9nYXNfTU1CVFUgPC0gZXhwb19xX2dhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc2VsZWN0KC1jKHVuaWRhZCkpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7Y29udmVyc29yX20zTU1CVFVfcSh4KjEwMDApfSApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNTUJUVSIpDQoNCiNNZXJnZSB2YWxvcg0KZXhwb191c2RfZ2FzIDwtIGV4cG9fc2VzY29fdXNkX2dhcyAlPiUNCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbykpICU+JSANCiAgbGVmdF9qb2luKGNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfbWVjb24gPSBleHBvX2dhc19NTXVzZCkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZXhwb19nYXNfbWVjb24gPSBleHBvX2dhc19tZWNvbiAqIDEwMDAwMDApKSAgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19oaWRyb192YWxvcl9pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19pbmRlYyA9IGV4cG9faW5kZWNfZ2FzKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19nYXNfc2l0YyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX2NvbXRyYWRlID0gdHJhZGVfdmFsdWVfdXNkLCB1bmlkYWQgKSkgJT4lIA0KICAjIG11dGF0ZShkaWYgPSBleHBvX3Nlc2NvX2dhcy9leHBvX2dhc19pbmRlYyAtMSkgJT4lIA0KICBtdXRhdGUoZXhwb19nYXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTcgfiBleHBvX2dhc19jb210cmFkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk3IH4gZXhwb19zZXNjb19nYXMpKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fZ2FzLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCiAgDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCBjYW50aWRhZGVzID0gZXhwb19xX2dhcywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNEID0gZXhwb191c2RfZ2FzLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXhwb195X3JlZmVyZW5jaWEgPSBwcmVjaW9fZXhwb195X21lX2dhcyksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2V4cG9fZ2FzLnhsc3giKQ0KDQojIGNvbWV4X2NydWRvX3Nlc2NvICU+JSBmaWx0ZXIodW5pZGFkID09ICJtMyIsIHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIpDQojIGNvbWV4X2dhcyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAibTMiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKQ0KIA0KDQoNCiMgd3JpdGUuY3N2KGV4cG9fcV9nYXMsIGZpbGUgPSAiLi4vcmVzdWx0YWRvcy9kYXRhX3Zpei9leHBvX3FfZ2FzLmNzdiIsIHJvdy5uYW1lcyA9IEYpDQojIHdyaXRlLmNzdihleHBvX3VzZF9nYXMsIGZpbGUgPSAiLi4vcmVzdWx0YWRvcy9kYXRhX3Zpei9leHBvX3VzZF9nYXMuY3N2Iiwgcm93Lm5hbWVzID0gRikNCmBgYA0KDQoNCiMjIEVtcGxlbywgUmVtdW5lcmFjaW9uZXMgeSBNYXNhIFNhbGFyaWFsIChDQ05OKQ0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojYW51YXJpb3MgQ0VQQUwNCmNlcGFsXzE5OTEgPC0gcmVhZF9leGNlbCggIi4uL2RhdGEvY2VwYWwvY2VwYWxfMTk5MS54bHN4IikgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIGNvbnZlcnNvcl9wZXNvcyRBIC8xMF4zLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKQ0KDQptYXNhX3NhbGFyaWFsX2NlcGFsIDwtIGNlcGFsXzE5OTEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInJlbXVuZXJhY2lvbl9hbF90cmFiYWpvIikgJT4lIA0KICByZW5hbWUobXNfY2VwYWwgPSB2YWxvcikNCiAgDQoNCiNjb24gZGF0b3MgZGUgbGEgYmFzZSBkZSBDQ05ODQplbXBsZW8gPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9tZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJFbXBsZW8gcmVnaXN0cmFkbyIsIHNraXAgPSA1KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgIHBlcmlvZG8gPSJQZXLDrW9kbyIsDQogICAgICAgICBlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gIi4uLjciLA0KICAgICAgICBlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSAiLi4uOCIgKSAlPiUNCiAgIGZpbHRlcihpcy5uYShwZXJpb2RvKSwgIWlzLm5hKGFuaW8pICkgJT4lDQogIHNlbGVjdChhbmlvLCBlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLGVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyApICU+JSANCiAgbXV0YXRlKHVuaWRhZF9lbXBsZW8gPSAiUHVlc3RvcyBkZSB0cmFiYWpvIiwNCiAgICAgICAgIGVtcGxlb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSBhcy5kb3VibGUoZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyksDQogICAgICAgICBlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSBhcy5kb3VibGUoZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSkgDQogIA0KDQpzYWxhcmlvcyA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL21lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIA0KICAgIHNoZWV0ID0gIlJlbXVuZXJhY2lvbmVzIiwgY29sX3R5cGVzID0gYygibnVtZXJpYyIsIA0KICAgICAgICAiZGF0ZSIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiKSwgc2tpcCA9IDUpICU+JSANCiAgICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgICBwZXJpb2RvID0iUGVyw61vZG8iLA0KICAgICAgICAgIHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gIi4uLjciLA0KICAgICAgICAgc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICAiLi4uOCIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSAmIGFuaW8gPCAyMDE0KSAlPiUgDQogIHNlbGVjdChhbmlvLCBzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyxzYWxhcmlvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICkgJT4lIA0KICBtdXRhdGUodW5pZGFkX3NhbGFyaW8gPSAiUGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcz0gYXMuZG91YmxlKHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9IGFzLmRvdWJsZShzYWxhcmlvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSkNCiAgIA0KbWFzYV9zYWxhcmlhbF9jY25uIDwtIGVtcGxlbyAlPiUgDQogIGxlZnRfam9pbihzYWxhcmlvcywgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9tYXNhX3NhbGFyaWFsID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uID0gKHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zICplbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9zZXJ2aWNpb3MgPSAoc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAqZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF90b3RhbCA9IG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiArIG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zKSANCg0KDQoNCiNjb24gZGF0b3MgZGUgZW1wbGVvIHJlZ2lzdHJhZG8gDQpyZW11bmVyYWNpb25lc19hbnVhbCA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL21pbl90cmFiYWpvL25hY2lvbmFsX3NlcmllX3JlbXVuZXJhY2lvbmVzX2FudWFsLnhsc3giLCANCiAgICBzaGVldCA9ICJDIDUiLCBjb2xfdHlwZXMgPSBjKCJza2lwIiwgDQogICAgICAgICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIpLCBza2lwID0gNCkgJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOm5jb2woLikpICU+JQ0KICByZW5hbWUocmFtYV9hY3RpdmlkYWQgPSAiUmFtYSBkZSBhY3RpdmlkYWQiKSAlPiUgDQogIGZpbHRlciggc3RyX2RldGVjdChyYW1hX2FjdGl2aWRhZCwgInBldHLDs2xlbyIpKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfc2FsYXJpbyA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIHJhbWFfYWN0aXZpZGFkPSANCiAgICAgICAgICAgY2FzZV93aGVuKHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aXZpZGFkZXMgIGRlIHNlcnZpY2lvcyByZWxhY2lvbmFkYXMgY29uIGxhIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcywgZXhjZXB0byBsYXMgYWN0aXZpZGFkZXMgZGUgcHJvc3BlY2Npw7NuIiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW11bmVyYWNpb25fc2VydmljaW9zX2V4dHJhY2Npb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1hX2FjdGl2aWRhZD09DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyB5IGdhcyBuYXR1cmFsIiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW11bmVyYWNpb25fZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiKSkgJT4lIA0KICAgIGZpbHRlcighKGlzLm5hKHJhbWFfYWN0aXZpZGFkKSkpICU+JSANCiAgc3ByZWFkKGtleSA9IHJhbWFfYWN0aXZpZGFkLA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikNCiAgDQoNCg0KZW1wbGVvX2FudWFsIDwtIHJlYWRfZXhjZWwoICIuLi9kYXRhL21pbl90cmFiYWpvL25hY2lvbmFsX3NlcmllX2VtcGxlb19hbnVhbC54bHN4IiwgDQogICAgc2hlZXQgPSAiQyA1IiwgY29sX3R5cGVzID0gYygic2tpcCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiKSwgDQogICAgc2tpcCA9IDQpJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOm5jb2woLikpICU+JQ0KICByZW5hbWUocmFtYV9hY3RpdmlkYWQgPSAiUmFtYSBkZSBhY3RpdmlkYWQiKSAlPiUgDQogIGZpbHRlciggc3RyX2RldGVjdChyYW1hX2FjdGl2aWRhZCwgInBldHLDs2xlbyIpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGFzLmRvdWJsZSh2YWxvciksDQogICAgICAgICB1bmlkYWRfZW1wbGVvID0gIlB1ZXN0b3MgZGUgdHJhYmFqbyIsDQogICAgICAgICByYW1hX2FjdGl2aWRhZD0gY2FzZV93aGVuKHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aXZpZGFkZXMgIGRlIHNlcnZpY2lvcyByZWxhY2lvbmFkYXMgY29uIGxhIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcywgZXhjZXB0byBsYXMgYWN0aXZpZGFkZXMgZGUgcHJvc3BlY2Npw7NuIiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbXBsZW9fc2VydmljaW9zX2V4dHJhY2Npb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1hX2FjdGl2aWRhZD09DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyB5IGdhcyBuYXR1cmFsIiB+ICJlbXBsZW9fZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiKSkgJT4lIA0KICBmaWx0ZXIoIShpcy5uYShyYW1hX2FjdGl2aWRhZCkpKSAlPiUgDQogIHNwcmVhZChrZXkgPSByYW1hX2FjdGl2aWRhZCwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpDQoNCm1hc2Ffc2FsYXJpYWxfb2VkZSA8LSBlbXBsZW9fYW51YWwgJT4lIA0KICBsZWZ0X2pvaW4ocmVtdW5lcmFjaW9uZXNfYW51YWwsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfbWFzYV9zYWxhcmlhbCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiA9ICggIHJlbXVuZXJhY2lvbl9leHRyYWNjaW9uX3BldHJvbGVvX2dhcyAqZW1wbGVvX2V4dHJhY2Npb25fcGV0cm9sZW9fZ2FzKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9zZXJ2aWNpb3MgPSAocmVtdW5lcmFjaW9uX3NlcnZpY2lvc19leHRyYWNjaW9uICplbXBsZW9fc2VydmljaW9zX2V4dHJhY2Npb24qMTMpLzEwXjYsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3RvdGFsID0gbWFzYV9zYWxhcmlhbF9zZXJ2aWNpb3MgKyBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24sDQogICAgICAgICBhbmlvID1hcy5kb3VibGUoYW5pbykpDQoNCm1hc2Ffc2FsYXJpYWxfaGlkcm9jYXJidXJvcyA8LSBtYXNhX3NhbGFyaWFsX2Njbm4gJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX21hc2Ffc2FsYXJpYWwsIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbl9jY25uPSBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24sIA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF90b3RhbF9jY25uID0gbWFzYV9zYWxhcmlhbF90b3RhbCkgJT4lIA0KICBmdWxsX2pvaW4obWFzYV9zYWxhcmlhbF9vZWRlICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9tYXNhX3NhbGFyaWFsLCANCiAgICAgICAgICAgICAgICAgICAgIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbl9vZWRlPSBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24sDQogICAgICAgICAgICAgICAgICAgICBtYXNhX3NhbGFyaWFsX3RvdGFsX29lZGUgPW1hc2Ffc2FsYXJpYWxfdG90YWwpKSAlPiUgDQogIGZ1bGxfam9pbihtYXNhX3NhbGFyaWFsX2NlcGFsICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgbXNfY2VwYWwpKSAlPiUgDQogICMgbXV0YXRlKG1zID0gY2FzZV93aGVuKGFuaW8gPCAxOTk2IH4gbXNfY2VwYWwsDQogICMgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5NiB+bWFzYV9zYWxhcmlhbF9vZWRlKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQptYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgIA0KDQoNCmBgYA0KDQoNCg0KDQojIyBBY3Rpdm9zDQoNClBhc2FyIGRhdG9zIGRlIGJzIGRlIHVzbyBlbiB5YWNpbWllbnRvcyBwYXJhIGFybWFyIHJlbGFjacOzbiBhY3Rpdm8geWFjaW1laW50by90b3RhbA0KDQpGdWVudGVzOg0KDQoqIEJhbGFuY2VzIGRlIEJvbHNhciAodW5pY2FtZW50ZSBlbXByZXNhcyBxdWUgY290aXphbiBlbiBsYSBib2xzYSBkZSB2YWxvcmVzIGFyZ2VudGluYSkuIFJldmlzYXIgZWwgc3RvY2sgZGVsIHNlY3RvciBkaXN0cmlidWNpw7NuIHBvcnF1ZSBzZSBwcmVzZW50YSBkZW1hc2lhZG8gZ3JhbmRlIGNvbiByZXNwZWN0byBhbCBkZSBsb3MgZGVtw6FzLiBGYWx0YSBwYXNhciBsb3MgZGF0b3MgZGVsIGFjdGl2byBkZSBjYXNpIHRvZGFzIGxhcyBlbXByZXNhcw0KKiBBRklQLiBDb24gZXN0YSBmdWVudGUgbm8gdGVuZW1vcyBjYWxjdWxvIGRlIHJlbnRhLCBzaW5vIHF1ZSBzb2xvIHVzYW1vcyBsYSBURyBjb21vIHBhcsOhbWV0cm8uIE5vdGE6ICJfYyIgc2lnbmlmaWNhIGNhc29zIHByZXNlbnRhZG9zIGRlIGxhIHZhcmlhYmxlIGNvcnJlc3BvbmRpZW50ZQ0KKiBNZW1vcmlhcyBkZSBZUEYuIExhIGTDqWNhZGEgZGUgbG9zIDgwIHByZXNlbnRhIHBpY29zIHF1ZSBoYXkgcXVlIHJldmlzYXINCg0KDQoqIENhbGN1bG8gZGVsIENhcGl0YWwgVG90YWwgQWRlbGFudGFkbyAoS1RBKSANCg0KICArIEJvbHNhcjogRXMgZXF1aXZhbGVudGUgYSBsYSBzdW1hIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvcyBOZXRhIChkZXNjb250YW5kbyBsb3MgdGVycmVub3MgeSBvYnJhcyBlbiBjdXJzbykgeSBsb3MgSW52ZW50YXJpb3MuIEN1YW5kbyBsb3MgZGF0b3MgbG8gaGFiaWxpdGFuLCBzZSBsZSBhZ3JlZ8OzIGxvcyBzYWxhcmlvcyBhZGVsYW50YWRvcyAoc2FsYXJpb3MgeSBjYXJnYXMgY29uc3VtaWRvcyBzb2JyZSByb3RhY2nDs24pLiBMdWVnbywgY3VhbmRvIG5vIHNlIHByZXNlbnRhcm9uIGRhdG9zIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvcywgc2UgdG9tw7MgZWwgYWN0aXZvIG5vIGNvcnJpZW50ZS4NCiAgKyBBRklQOiBFcyBlcXVpdmFsZW50ZSBhIGxhIHN1bWEgZGUgQmllbmVzIGRlIFVzbywgQmllbmVzIGRlIENhbWJpbywgSW52ZW50YXJpb3MgeSBEaXNwb25pYmlsaWRhZGVzLg0KICArIE1lbW9yaWEgWVBGOiBTdW1hIGRlIEJpZW5lcyBkZSBVc28geSBCaWVuZXMgZGUgQ2FtYmlvDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBCT0xTQVINCg0KI3NlZ21lbnRvcyBkZSBZUEYgeSBQZXRyb2JyYXMNCnlwZl9zZWcgPC0gcmVhZF9kZWxpbSgiLi4vZGF0YS95cGYveXBmX3NlZ21lbnRvcy5jc3YiLCANCiAgICAiLCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgc2VsZWN0KC0iLi4uMSIpICU+JSANCiAgbXV0YXRlKHNlY3RvciA9IGNhc2Vfd2hlbiggc2VjdG9yID09ICAicXVpbWljYSIgfiAicGV0cm9xdWltaWNhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHNlY3RvciksDQogICAgICAgICBhbmlvID0geWVhcihmZWNoYSkpDQoNCnBldHJvYnJhc19hcl9zZWcgPC0gcmVhZF9kZWxpbSgiLi4vZGF0YS9iYWxhbmNlcy9wZXRyb2JyYXNfYXJnX3NlZ21lbnRvcy5jc3YiLCANCiAgICAiLCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpJT4lIA0KICBzZWxlY3QoLSIuLi4xIikNCg0KdW5pb25fc2VnbWVudG9zIDwtIHlwZl9zZWcgJT4lIA0KICBzZWxlY3QoYW5pbywgZW1wcmVzYSxzZWN0b3IsIHVuaWRhZCwgYWN0aXZvID0gYWN0aXZvcykgJT4lIA0KICBiaW5kX3Jvd3MocGV0cm9icmFzX2FyX3NlZyAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShhbmlvID0gZmVjaGEpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBlbXByZXNhLCB1bmlkYWQsIHNlY3RvciwgDQogICAgICAgICAgICAgICAgICAgICBwcm9wX3BsYW50YV9lcXVpcG8gPSBwcHllLCBhY3Rpdm8gPSBhY3Rpdm9zKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNTpuY29sKC4pKSAlPiUNCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHZhbG9yID12YWxvci9pcGNfMTgsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgc2VsZWN0KC1pcGNfMTgpDQoNCnN0b2NrX3NlZ21lbnRvcyA8LSB1bmlvbl9zZWdtZW50b3MgJT4lIA0KICBncm91cF9ieShhbmlvLCBzZWN0b3IsIHZhcmlhYmxlICx1bmlkYWQgKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoZnVlbnRlID0gIkFjdGl2byBkZSBZUEYgeSBQZXRyb2JyYXMiLA0KICAgICAgICAgdmFyaWFibGVfc2VjdG9yID0gcGFzdGUodmFyaWFibGUsIHNlY3Rvciwgc2VwID0gIiAiKSkNCg0KDQojIyBTdG9jayBwb3IgZW1wcmVzYXMNCnN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2JhbGFuY2VzL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKCIuLi4xIiA9IGNvbF9za2lwKCkpKSAlPiUgDQogIGZpbHRlciggIShlbXByZXNhICVpbiUgYygiY2hldnJvbl9nbG9iYWwiLCAicGV0cm9icmFzX2dsb2JhbCIgKSkpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IiwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKGZlY2hhKSwNCiAgICAgICAgIGZ1ZW50ZSA9ICJCb2xzYXIiKSAlPiUNCiAgc2VsZWN0KGFuaW8sZnVlbnRlLHVuaWRhZCwgZXZlcnl0aGluZyguKSwgLWMoZmVjaGEsIHBhaXMsIHRnX2FudCwgdGdfZGVzcCwgcm90YWNpb24pKSAlPiUgDQogICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNzpuY29sKC4pKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC9pcGNfMTgsDQogICAgICAgICBlbXByZXNhID0gY2FzZV93aGVuKGVtcHJlc2EgPT0gInBldHJvYnJhc19hciIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAidGVjcGV0cm9sIiB+ICJUZWNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJjYW11enppX3BhbXAiIH4gIkNhbXV6emkgR2FzIFBhbXBlYW5hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAibWV0cm9nYXMiIH4gIk1ldHJvZ2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGVtcHJlc2EpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGVtcHJlc2EsZnVlbnRlLCBzZWN0b3IsIHVuaWRhZCwgdmFyaWFibGUpICU+JQ0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgJWluJSBjKCJLVEEiLCAicHB5ZSIsICJwcHllX25ldGEiICwgImludmVudGFyaW9zIiwgImFjdGl2b19ub19jb3JyIiwgImFjdGl2byIpKQ0KDQojIyBTdG9jayBwb3IgcmFtYQ0Kc3RvY2tfYmFsYW5jZXNfcmFtYSA8LSAgc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGJpbmRfcm93cyhzdG9ja19zZWdtZW50b3MgJT4lIA0KICAgICAgICAgICAgICAjIGZpbHRlcihzZWN0b3IgPT0gInVwc3RyZWFtIiAmIHZhcmlhYmxlID09ICJhY3Rpdm8iKSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlX3NlY3RvciA9PSAiYWN0aXZvIHVwc3RyZWFtIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdCgtdmFyaWFibGVfc2VjdG9yKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHNlY3RvciA9IGNhc2Vfd2hlbihzZWN0b3IgPT0gInVwc3RyZWFtIiB+ICJwcm9kdWNjaW9uIiksDQogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSA9ICBjYXNlX3doZW4odmFyaWFibGUgPT0gImFjdGl2byIgfiAicHB5ZSIpLA0KICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID0gIkJvbHNhciIsDQogICAgICAgICAgICAgICAgICAgICBlbXByZXNhID0iWVBGIHkgUGV0cm9icmFzIikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgc2VjdG9yLHZhcmlhYmxlLCB1bmlkYWQsIGZ1ZW50ZSkgJT4lDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgIA0KICANCiAgIyBzcHJlYWQoa2V5ID0gc2VjdG9yLA0KICAjICAgICAgICB2YWx1ZSA9IEtUQSkgJT4lIA0KICAjIG11dGF0ZShpbnRlZ3JhZGFfeV9leHRyYWNjaW9uID0gaW50ZWdyYWRhICsgcHJvZHVjY2lvbiwNCiAgIyAgICAgICAgdmFyaWFibGUgPSAiS1RBIikgJT4lIA0KICAjIHJlbmFtZShleHRyYWNjaW9uID0gcHJvZHVjY2lvbikgJT4lIA0KICAjIHNlbGVjdChhbmlvLCB2YXJpYWJsZSwgbW9uZWRhLCBldmVyeXRoaW5nKC4pKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBUYXNhcyBkZSBkZXByZWNpYWNpb24NCiNBRklQDQp0YXNhX2RlcHJlY2lhY2lvbl9hZmlwIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvYWZpcC9nY2lhX3Y4Lnhsc3giLCANCiAgICBza2lwID0gNCkgJT4lDQogIHNlbGVjdCgtYyg0OTpuY29sKC4pKSkgJT4lIA0KICBncm91cF9ieSggcmFtYSwgeWVhcikgJT4lIA0KICBzdW1tYXJpc2UodGFzYV9kZXByZWNpYWNpb24gPSBkZXByZWNpYWNpb25ic3Vzby9ic3VzbykNCg0KI0JhbGFuY2VzDQpyZWFkX2NzdigiLi4vZGF0YS9iYWxhbmNlcy9iYWxhbmNlc19hcmcuY3N2IiwgDQogICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JQ0KICAgIGZpbHRlcihlbXByZXNhID09ICJZUEYiKSAlPiUgDQogICAgZ3JvdXBfYnkoZW1wcmVzYSkgJT4lIA0KICAgIG11dGF0ZSh0YXNhX2RlcHJlY2lhY2lvbiA9IGRlcHJlY2lhY2lvbmVzL3BweWUpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBlbXByZXNhLCB0YXNhX2RlcHJlY2lhY2lvbikNCg0KDQojIyNBRklQDQojIFN0b2NrIGRlIGJhbGFuY2VzIC0gIEFGSVANCmRhdG9zX2FmaXAgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9hZmlwL2djaWFfdjgueGxzeCIsIA0KICAgIHNraXAgPSA0KSAlPiUNCiAgc2VsZWN0KC1jKDQ5Om5jb2woLikpKSAgJT4lIA0KICByZW5hbWUoYW5pbyA9IHllYXIsDQogICAgICAgICBpZHNlY3RvciA9IGlkcmFtYSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgc2VjdG9yID0gY2FzZV93aGVuKCByYW1hID09ICJwZXRybyIgfiAiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtYSA9PSAic2VyX3BldHJvIiB+ICJzZXJ2aWNpb3NfcGV0cm9sZXJvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmFtYSkpJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBpZHNlY3Rvciwgc2VjdG9yLCBldmVyeXRoaW5nKC4pLCAtcmFtYSkNCmRhdG9zX2FmaXANCg0KDQpzdG9ja19hZmlwIDwtIGRhdG9zX2FmaXAgJT4lIA0KICBncm91cF9ieShhbmlvLCBpZHNlY3Rvciwgc2VjdG9yLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKEtUQSA9IGRpc3BvbmliaWxpZGFkZXMgKyBic2NhbWJpbyArIGludmVudGFyaW9zICsgYnN1c28sDQogICAgICAgICAgICBwcHllID0gc3VtKGJzdXNvLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgYWN0aXZvID0gc3VtKGFjdGl2bywgbmEucm0gPSBUKSkgJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKEtUQSA9IChLVEEvMTBeNikgLyBpcGNfMTgsDQogICAgICAgICBwcHllPSAocHB5ZS8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIGFjdGl2bz0gKGFjdGl2by8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikgJT4lIA0KICBhcnJhbmdlKGlkc2VjdG9yKSAlPiUgDQogIGZpbHRlcihzZWN0b3IgJWluJSBjKCJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsICJzZXJ2aWNpb3NfcGV0cm9sZXJvcyIpKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1jKGlkc2VjdG9yLCBpcGNfMTgpKSAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgbXV0YXRlKGZ1ZW50ZSA9ICJBRklQIikNCnN0b2NrX2FmaXANCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgDQojIE1lbW9yaWFzIFlQRiANCmJhbGFuY2VfeXBmIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEveXBmL0NhbGN1bG9zIEJldGFuaWEgVGcueGxzIiwgDQogICAgc2hlZXQgPSAiWVBGX0EgJEhPWV9QQVJBREVGTEFDWUNBTENVTEFSIiwgDQogICAgc2tpcCA9IDEpICU+JSANCiAgc2VsZWN0KC1jKDEyOm5jb2woLikpKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgdW5pZGFkID0gbW9uZWRhLA0KICAgICAgICAgdmVudGFzID0gIlZlbnRhcy4uLjMiLA0KICAgICAgICAgY29zdG9fdmVudGFzID0gIkNvc3RvIGRlIGxhcyBWZW50YXMuLi40IiwNCiAgICAgICAgIHV0aWxpZGFkX25ldGEgPSAiVXRpbGlkYWQgbmV0YSIsDQogICAgICAgICB1dGlsaWRhZF9vcGVyYXRpdmEgPSAiVXRpbGlkYWQgb3BlcmF0aXZhIiwNCiAgICAgICAgIHBweWUgPSAiQnMgVXNvIiwNCiAgICAgICAgIGJpZW5lc19kZV9jYW1iaW8gPSAiQnMgQ2FtYmlvIiwNCiAgICAgICAgIHV0aWxpZGFkX25ldGFfYW50ZXNfaW1wdWVzdG9zID0gIlVOIGFudGVzIGRlIGltcHVlc3RvcyAoZ8K0IGFjdGl2b3MgeSBkaXZpZGVuZG9zKSIsDQogICAgICAgICBhY3Rpdm8gPSAiQWN0aXZvIFRvdGFsIiwNCiAgICAgICAgIHBhdHJpbW9uaW9fbmV0byA9ICJQYXRyaW1vbmlvIE5ldG8iKSAlPiUNCiAgZmlsdGVyKCEoaXMubmEoYW5pbykpKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUNCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjZ9KSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zICBkZSAyMDE4IiwNCiAgICAgICAgIHZlbnRhcyA9dmVudGFzL2lwY18xOCwNCiAgICAgICAgIGNvc3RvX3ZlbnRhcyA9IGNvc3RvX3ZlbnRhcy9pcGNfMTgsDQogICAgICAgICB1dGlsaWRhZF9uZXRhID0gdXRpbGlkYWRfbmV0YS9pcGNfMTgsDQogICAgICAgICB1dGlsaWRhZF9vcGVyYXRpdmEgPSB1dGlsaWRhZF9vcGVyYXRpdmEvaXBjXzE4LA0KICAgICAgICAgcHB5ZSA9IHBweWUvaXBjXzE4LA0KICAgICAgICAgYmllbmVzX2RlX2NhbWJpbyA9IGJpZW5lc19kZV9jYW1iaW8vaXBjXzE4LA0KICAgICAgICAgdXRpbGlkYWRfbmV0YV9hbnRlc19pbXB1ZXN0b3MgPSB1dGlsaWRhZF9uZXRhX2FudGVzX2ltcHVlc3Rvcy9pcGNfMTgsDQogICAgICAgICBhY3Rpdm8gPSBhY3Rpdm8vaXBjXzE4LA0KICAgICAgICAgcGF0cmltb25pb19uZXRvID0gcGF0cmltb25pb19uZXRvL2lwY18xOCwNCiAgICAgICAgIEtUQSA9IHBweWUgKyBiaWVuZXNfZGVfY2FtYmlvLA0KICAgICAgICAgc2VjdG9yID0gIk1lbW9yaWEgZGUgWVBGIikgJT4lIA0KICBzZWxlY3QoYW5pbywgc2VjdG9yLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpIA0KYmFsYW5jZV95cGYNCg0Kc3RvY2tfeXBmIDwtIGJhbGFuY2VfeXBmICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygiS1RBIiwgImFjdGl2byIsICJwcHllIikpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gY2FzZV93aGVuKGFuaW8gPT0gMTk4MyB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODUgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg2IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4NyB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODggfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHZhbG9yKSkgJT4lDQogIGJpbmRfcm93cyhzdG9ja19iYWxhbmNlc19lbXByZXNhcyAlPiUgDQogICAgdW5ncm91cCgpICU+JSANCiAgICBzZWxlY3QoYW5pbywgIHNlY3RvciA9ZW1wcmVzYSwgdW5pZGFkLCB2YXJpYWJsZSwgdmFsb3IgKSAlPiUgDQogICAgZmlsdGVyKHNlY3RvciA9PSAiWVBGIiwNCiAgICAgICAgICAgdmFyaWFibGUgICVpbiUgYygiS1RBIiwgImFjdGl2byIsICJwcHllIikpKQ0KICANCg0KYGBgDQoNCiMjIyBTdG9jayB0b3RhbCBkZSBsYSByYW1hIA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgU3RvY2sgZGUgbGEgcmFtYQ0Kc3RvY2tfcmFtYSA8LSBzdG9ja19hZmlwICU+JSANCiAgYmluZF9yb3dzKHN0b2NrX2JhbGFuY2VzX3JhbWEpDQoNCiMgd3JpdGUuY3N2KHN0b2NrX3JhbWEsIGZpbGUgPSIvQXJjaGl2b3MvRGF0b3MvU3RvY2svc3RvY2tfaGlkcm9jYXJidXJvcy5jc3YiKQ0KDQpgYGANCg0KDQojIyMgU3RvY2sgZGUgc2VnbWVudG9zIGRlIFlQRiB5IFBldHJvYnJhcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgZ3JhZl9zdG9ja19zZWdtZW50b3MgPC0gdW5pb25fc2VnbWVudG9zICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHNlY3RvcikpKw0KIyAgIGdlb21fbGluZSgpKw0KIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiMgICBsYWJzKHRpdGxlID0gIlN0b2NrIGRlIGNhcGl0YWwgZGUgc2VnbWVudG9zIiwNCiMgICAgICAgIHN1YnRpdGxlID0gIllQRiB5IFBldHJvYnJhcyBBcmdlbnRpbmEiLA0KIyAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQojICAgdGhlbWVfY2xhc3NpYygpKw0KIyAgIGZhY2V0X3dyYXAodmFyaWFibGUgfiBlbXByZXNhICkNCiMgDQojIGdncGxvdGx5KGdyYWZfc3RvY2tfc2VnbWVudG9zLCB3aWR0aCA9IDcwMCwgaGVpZ2h0ID0gNTAwKQ0KDQoNCmBgYA0KDQojIyMgU3RvY2sgcG9yIGVtcHJlc2FzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgZ3JhZl9zdG9ja19lbXAgPC0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQojICAgZmlsdGVyKA0KIyAgICAgIyB2YXJpYWJsZSAlaW4lIGMoIktUQSIsICJhY3Rpdm8iKSwNCiMgICAgICAgICAgc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBlbXByZXNhKSkrIA0KIyAgIGdlb21fbGluZSgpKw0KIyAgIGdlb21fcG9pbnQoKSsNCiMgICBsYWJzKHRpdGxlID0gIlN0b2NrIGRlIGNhcGl0YWwgcG9yIGVtcHJlc2EiLA0KIyAgICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KIyAgIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KIyBnZ3Bsb3RseShncmFmX3N0b2NrX2VtcCwgd2lkdGggPSA3MDAsIGhlaWdodCA9IDUwMCkNCg0KDQpgYGANCg0KIyMjIFlQRiBsYXJnbyBwbGF6bw0KQ29tcGFyYWNpw7NuIGVudHJlIGxhIE1lbW9yaWEgWVBGIChyZWNvcGlsYWRvIHBvciBCRlIpIHkgbG9zIGJhbGFuY2VzIGV4dHLDrWFkb3MgZGUgQm9sc2FyDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIGdyYWZfc3RvY2tfeXBmIDwtICBzdG9ja195cGYgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrIA0KIyAgIGdlb21fbGluZSgpKw0KIyAgIGdlb21fcG9pbnQoKSsNCiMgICBsYWJzKHRpdGxlID0gIlN0b2NrIGRlIGNhcGl0YWwgZGUgWVBGIiwNCiMgICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiMgICBmYWNldF93cmFwKH52YXJpYWJsZSkNCiMgZ2dwbG90bHkoZ3JhZl9zdG9ja195cGYsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCmBgYA0KDQoNCg0KIyMjIyMgWVBGDQpgYGB7cn0NCiNtZXRyb3MgcGVyZm9yYWRvcw0KbWV0cm9zX3BlcmZvcmFkb3NfcG9zdGVyaW9yX2FsXzIwMDkgPC0gcmVhZF9jc3YoIi4uL2RhdGEvc2VjcmV0YXJpYV9lbmVyZ2lhL3Nlc2NvL21ldHJvcy1wZXJmb3JhZG9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoaW5kaWNlX3RpZW1wbyA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlWS0lbSIpKSkNCg0KbWV0cm9zX3BlcmZvcmFkb3NfYW50ZXJpb3JfYWxfMjAwOSA8LSByZWFkX2NzdigiLi4vZGF0YS9zZWNyZXRhcmlhX2VuZXJnaWEvc2VzY28vbWV0cm9zLXBlcmZvcmFkb3MtYW50ZXJpb3ItYWwtMjAwOS5jc3YiKSAlPiUgDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKQ0KDQptZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhIDwtIG1ldHJvc19wZXJmb3JhZG9zX3Bvc3Rlcmlvcl9hbF8yMDA5ICU+JQ0KICBiaW5kX3Jvd3MobWV0cm9zX3BlcmZvcmFkb3NfYW50ZXJpb3JfYWxfMjAwOSkgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLCBpZGVtcHJlc2EsIGVtcHJlc2EsIGlkY29uY2VwdG8sIGNvbmNlcHRvLCBjYW50aWRhZCwgb2JzZXJ2YWNpb25lcyApICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgaWRlbXByZXNhLCBlbXByZXNhKSAlPiUNCiAgc3VtbWFyaXNlKG1ldHJvc19wZXJmb3JhZG9zID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQojbGlzdGFkbyBkZSBlbXByZXNhcyBjb24gc3VzIGlkJ3MNCmxpc3RhZG9fZW1wcmVzYSA8LSBkaXN0aW5jdChtZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGlkZW1wcmVzYSwgZW1wcmVzYSksaWRlbXByZXNhLCAua2VlcF9hbGwgPSBUKSANCg0KIyBzZWMgZW5lcmdpYQ0KIyBwb3pvcyBjYXJnYWRvcyBwb3IgZW1wcmVzYXMNCmxpc3RhZG9fcG96b3MgPC0gcmVhZF9jc3YoIi4uL2RhdGEvc2VjcmV0YXJpYV9lbmVyZ2lhL2NhcF9pdi9saXN0YWRvLWRlLXBvem9zLWNhcmdhZG9zLXBvci1lbXByZXNhcy1vcGVyYWRvcmFzLmNzdiIpICU+JSANCiAgbXV0YXRlKGFuaW9fdGVybWluYWNpb25fcG96byA9eWVhcihhZGppdl9mZWNoYV9maW5fdGVybSkpICU+JQ0KICBsZWZ0X2pvaW4obGlzdGFkb19lbXByZXNhKSAlPiUgDQogIGdyb3VwX2J5KGFuaW9fdGVybWluYWNpb25fcG96bywgaWRlbXByZXNhLCBlbXByZXNhKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvcyA9IG4oKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW9fdGVybWluYWNpb25fcG96bykpDQpgYGANCg0KDQpgYGB7cn0NCg0KDQpwcHllX3lwZiA8LSB5cGZfc2VnICU+JSANCiAgZmlsdGVyKHNlY3RvciAgPT0gInVwc3RyZWFtIiApICU+JSANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGlwY18xOCksIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZSh2YXJpYWJsZSA9ICJhY3Rpdm9fdXBzdHJlYW1feXBmIiwNCiAgICAgICAgIGFjdGl2b3MgPSBhY3Rpdm9zL2lwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IiklPiUgDQogIHNlbGVjdChhbmlvLCBlbXByZXNhLCB1bmlkYWQgLCAgYWN0aXZvX3Vwc3RyZWFtPSBhY3Rpdm9zKSAlPiUgDQogIGxlZnRfam9pbihzdG9ja19iYWxhbmNlc19lbXByZXNhcyAlPiUgDQogICAgdW5ncm91cCgpICU+JSANCiAgICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgZW1wcmVzYSA9PSAiWVBGIikgJT4lDQogICAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIHVuaWRhZCwgcHB5ZV9pbnRlZ3JhZGEgPXZhbG9yKSAsIGJ5ID0gYygiYW5pbyIsICJlbXByZXNhIiwgInVuaWRhZCIpKSAlPiUgDQogIG11dGF0ZShhY3Rpdm9fdXBzdHJlYW0gPSB2YXJpYWNpb25faW50ZXJhbnVhbChhY3Rpdm9fdXBzdHJlYW0pLA0KICAgICAgICAgcHB5ZV9pbnRlZ3JhZGEgPSB2YXJpYWNpb25faW50ZXJhbnVhbChwcHllX2ludGVncmFkYSkpICU+JSANCiAgZnVsbF9qb2luKGxpc3RhZG9fcG96b3MgJT4lDQogICAgICAgICAgICAgIHNlbGVjdCgtZW1wcmVzYSkgJT4lIA0KICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoaWRlbXByZXNhID09ICJZUEYiKSAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShhbmlvID0gYW5pb190ZXJtaW5hY2lvbl9wb3pvLCBlbXByZXNhID0gaWRlbXByZXNhKSwgYnkgPSBjKCJhbmlvIiwgImVtcHJlc2EiKSApICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KcHB5ZV95cGYNCg0KcHB5ZV95cGZfdGFzYXMgPC0gcHB5ZV95cGYgJT4lDQogICBhcnJhbmdlKGFuaW8pICU+JQ0KICBmaWx0ZXIoYW5pbyAlaW4lIDE5OTg6MjAxOCkgJT4lDQogIHNlbGVjdCgtYyhhbmlvLCBlbXByZXNhLCB1bmlkYWQpKSAlPiUNCiAgbXV0YXRlX2FsbCh0YXNhX2NyZWNpbWllbnRvKQ0KDQojbWF0cml6IGRlIGNvcnJlbGFjaW9uDQojIGNvcl9wb3pvc195cGYgPC0gY29yKHBweWVfeXBmX3Rhc2FzLCB1c2UgPSAiY29tcGxldGUub2JzIikNCiMgY29yX3Bvem9zX3lwZg0KDQojICBkaXN0aW50b3MgY29ycmVsb2dyYW1hcw0KI2NvbiBnZ2NvcnJwbG90DQojIHAubWF0ID0gY29yX3BtYXQoY29yX3Bvem9zX3lwZikNCiMgZ2djb3JycGxvdChjb3JfcG96b3NfeXBmLCBoYy5vcmRlciA9IFRSVUUsDQojICAgICB0eXBlID0gImxvd2VyIiwgcC5tYXQgPSBwLm1hdCwgbGFiID0gVCkNCg0KIyBHR2FsbHk6OmdncGFpcnMocHB5ZV95cGZfdGFzYXMsIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gInNtb290aCIpKQ0KIyBwbG90KHBweWVfeXBmX3Rhc2FzKQ0KYGBgDQoNCg0KYGBge3J9DQojYcOxb3MgYmFzZXMNCmFuaW9fYmFzZV95cGZfc2VnbWVudG8gPC0gICBwcHllX3lwZiRhY3Rpdm9fdXBzdHJlYW1bcHB5ZV95cGYkYW5pbyA9PSAyMDA2XQ0KDQphbmlvX2Jhc2VfeXBmX2JvbHNhciA8LSBwcHllX3lwZiRwcHllX2ludGVncmFkYVtwcHllX3lwZiRhbmlvID09IDIwMDZdDQoNCg0Kc3RvY2tfeV9wb3pvc195cGYgPC0gIHBweWVfeXBmICU+JSANCiAgbXV0YXRlKGluZGljZV9wb3pvc18wNiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllPSBwb3pvcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDA2KSkgJT4lIA0KICBtdXRhdGUocHB5ZV95cGZfZXN0aW1hZG8gPSBhbmlvX2Jhc2VfeXBmX2JvbHNhciAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIGFjdGl2b195cGZfZXN0aW1hZG8gPWFuaW9fYmFzZV95cGZfc2VnbWVudG8gKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICB1bmlkYWRfcHB5ZT0iTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpDQoNCiMgc3RvY2tfeV9wb3pvc195cGYgJT4lDQojICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcHllLCBwcHllX3lwZl9lc3RpbWFkbywgYWN0aXZvX3lwZl9lc3RpbWFkbykgJT4lDQojICAgICAgICAgICAgZ2F0aGVyKGtleSA9IGVzdGltYWNpb24sDQojICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiMgICAgICAgICAgICAgICAgICAgIDM6NCkgJT4lIA0KIyAgICAgICAgICAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLHZhbG9yICwgY29sb3IgPSBlc3RpbWFjaW9uKSkrDQojICAgZ2VvbV9saW5lKCkrDQojICAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSBkZSBZUEYgYSBwYXJ0aXIgZGUgaW5kaWNlIGRlIHBvem9zIikNCmBgYA0KDQojIyMjIyMgUFB5RSB5IGFjdGl2byB1cHN0cmVhbSB0b3RhbCByYW1hIGEgcGFydGlyIGRlIFlQRg0KDQpgYGB7cn0NCnBvem9zX3lmcF9zb2JyZV90b3RhbCA8LSBsaXN0YWRvX3Bvem9zICU+JQ0KICByZW5hbWUoYW5pbyA9IGFuaW9fdGVybWluYWNpb25fcG96bykgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkgJT4lIA0KICBsZWZ0X2pvaW4obGlzdGFkb19wb3pvcyAlPiUNCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGlkZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX2NhcmdhZG9zX3lwZiA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkpICU+JSANCiAgbXV0YXRlKHlwZl9zb2JyZV90b3RhbCA9IHBvem9zX2NhcmdhZG9zX3lwZi9wb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSkNCiMgcG96b3NfeWZwX3NvYnJlX3RvdGFsDQoNCmVzdGltYWNpb25fcHB5ZV90b3RhbF92aWFfeXBmIDwtIHN0b2NrX3lfcG96b3NfeXBmICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcHllLCBwcHllX3lwZl9lc3RpbWFkbywgYWN0aXZvX3lwZl9lc3RpbWFkbykgJT4lIA0KICBnYXRoZXIoa2V5ID0gZXN0aW1hY2lvbiwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgMzo0KSAlPiUgDQogIGxlZnRfam9pbihwb3pvc195ZnBfc29icmVfdG90YWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgeXBmX3NvYnJlX3RvdGFsKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvci95cGZfc29icmVfdG90YWwsDQogICAgICAgICAgZXN0aW1hY2lvbiA9IGNhc2Vfd2hlbihlc3RpbWFjaW9uID09ICJwcHllX3lwZl9lc3RpbWFkbyIgfiAicHB5ZV9lc3RpbWFkb190b3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWFjaW9uID09ICJhY3Rpdm9feXBmX2VzdGltYWRvIiB+ICJhY3Rpdm9fZXN0aW1hZG9fdXBzdHJlYW0iICkpDQogIA0KIyBlc3RpbWFjaW9uX3BweWVfdG90YWxfdmlhX3lwZiAlPiUNCiMgICAgICAgICAgICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbyx2YWxvciAsIGNvbG9yID0gZXN0aW1hY2lvbikpKw0KIyAgIGdlb21fbGluZSgpKw0KIyAgIGxhYnMoeT0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiLCANCiMgICAgICAgIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSB0b3RhbCBhIHBhcnRpciBkZSBhbXBsaWFjacOzbiBkZSBwb3pvcyBZUEYiKQ0KYGBgDQoNCg0KDQoNCiMjIFJlZ2Fsw61hcw0KDQoqIEZ1ZW50ZXM6IA0KICArIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChCYXNlIFJlZ2Fsw61hcykNCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojcmVnYWxpYXMgU2VjIGRlIEVuZXJnaWENCiNmaWx0cm8gY29uIHByb2R1Y3Rvcw0KcHJvZHVjdG9zIDwtIGxpc3QoImNydWRvIiwgImdhcyIsICJnYXNvbGluYSIsICJnbHAiKQ0KDQojbG9vcCBwYXJhIGxldmFudGFyIGxhcyBiYXNlcw0KbGlzdGFfcmVnYWxpYXMgPSBsaXN0KCkNCmZvcihpIGluIHByb2R1Y3Rvcyl7DQogIHJlZ2FsaWFzX2kgPC0gcmVhZF9kZWxpbShwYXN0ZTAoIi4uL2RhdGEvc2VjcmV0YXJpYV9lbmVyZ2lhL3JlZ2FsaWFzL3JlZ2FsaWFzXyIsIGksICIuY3N2IiksIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDEpDQogIGxpc3RhX3JlZ2FsaWFzW1tpXV0gPC0gcmVnYWxpYXNfaQ0KfQ0KDQoNCg0KI2Jhc2VzIGluZGl2aWR1YWxlcw0KcmVnYWxpYXNfY3J1ZG8gPC0gbGlzdGFfcmVnYWxpYXMkY3J1ZG8gJT4lIA0KICBtdXRhdGUobW9uZWRhID0gIlVTRCIsDQogICAgICAgICBwcm9kdWN0byA9ICJjcnVkbyIpDQpyZWdhbGlhc19nYXMgPC0gbGlzdGFfcmVnYWxpYXMkZ2FzICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJhcnMiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiZ2FzIikNCnJlZ2FsaWFzX2dhc29saW5hIDwtIGxpc3RhX3JlZ2FsaWFzJGdhc29saW5hICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJVU0QiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiZ2Fzb2xpbmEiKQ0KcmVnYWxpYXNfZ2xwIDwtIGxpc3RhX3JlZ2FsaWFzJGdscCAlPiUgDQogIG11dGF0ZShtb25lZGEgPSAiYXJzIiwNCiAgICAgICAgIHByb2R1Y3RvID0gImdscCIpDQoNCg0KDQojYmFzZSBjb21wbGV0YQ0KcmVnYWxpYXNfc2VjX2VuIDwtICByZWdhbGlhc19jcnVkbyAlPiUgDQogIGJpbmRfcm93cyhyZWdhbGlhc19nYXMsIHJlZ2FsaWFzX2dhc29saW5hLCByZWdhbGlhc19nbHApICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwgDQogICAgICAgICByZWdhbGlhc19zZSA9ICJUT1RBTCBQUk9WSU5DSUEiKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBtZXMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBhbmlvLCBtZXMsIHByb2R1Y3RvLCBtb25lZGEsIHJlZ2FsaWFzX3NlLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGdyb3VwX2J5KHByb2R1Y3RvLCBhbmlvLCBtb25lZGEgKSAlPiUgDQogIHN1bW1hcmlzZShyZWdhbGlhc19zZSA9IHN1bShyZWdhbGlhc19zZSkpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAlPiUgDQogIG11dGF0ZShyZWdhbGlhc19zZSA9IGNhc2Vfd2hlbihtb25lZGEgPT0gIlVTRCIgfiByZWdhbGlhc19zZSAqIFRDQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByZWdhbGlhc19zZSksDQogICAgICAgICB1bmlkYWQgPSAiYXJzIikgJT4lIA0KICBzZWxlY3QoLWMoVENDLCBtb25lZGEpKQ0KDQojRlIgeSBEQg0KcmVnYWxpYXNfZnIgPC0gIHJlYWRfZXhjZWwoIi4uL2RhdGEveXBmL0FudWFyaW8gRXN0YWRpc3RpY28gWVBGIC0gRGF0b3MgdmVudGFzIDE5NjMtMTk5MS54bHN4IiwgDQogICAgc2hlZXQgPSAiUmVnYWzDrWFzIGPDoWxjdWxvIiAsIHNraXAgPTIpICU+JSANCiAgIHNlbGVjdChhbmlvID0gIi4uLjEiICwgcmVnYWxpYXNfZnIgPSAiUmVnYWzDrWFzLi4uOSIpDQoNCg0KIyBiYXNlIGNvbXBsZXRhDQpyZWdhbGlhcyA8LSByZWdhbGlhc19zZWNfZW4gJT4lICAgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UocmVnYWxpYXNfc2UgPSBzdW0ocmVnYWxpYXNfc2UsIG5hLnJtID0gVCkpICAlPiUgDQogICMgZnVsbF9qb2luKHJlZ2FsaWFzX2ZyLCBieSAgPSAiYW5pbyIpICU+JSANCiAgZnVsbF9qb2luKHJlbnRhX2hpZHJvY2FyYnVyb3NfZnIgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUocmVnYWxpYXMgPSAgKHJlZ2FsaWFzKmlwY18xOCkqMTBeNikgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmVnYWxpYXNfZnIgPSByZWdhbGlhcyApLCBieSAgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHJlZ2FsaWFzX3RvdGFsID0gY2FzZV93aGVuKGFuaW8gPDE5OTEgfiAgMCwjIHJlZ2FsaWFzX2ZyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTkxIH5yZWdhbGlhc19zZSkpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KDQpyZWdhbGlhc191c2QgPC0gcmVnYWxpYXMgJT4lDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykpICU+JQ0KICBtdXRhdGUocmVnYWxpYXMgPSByZWdhbGlhc190b3RhbCAvdGNjLA0KICAgICAgICAgdW5pZGFkID0gIlVTRCIpICU+JQ0KICBzZWxlY3QoLWMocmVnYWxpYXNfdG90YWwsIHRjYykpDQoNCg0KYGBgDQoNCiMjIFN1YnNpZGlvcw0KYGBge3J9DQojIENFRklQIGNvbnQgZXQgYWwuIFN1YnNpZGlvcyBjb21vICUgZGVsIFBCSQ0Kc3Vic2lkaW9zX2NlZmlwIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvY2VmaXAvc3Vic2lkaW9zLnhsc3giKSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSBzdWJzaWRpb3NfcG9yY2VudGFqZV9wYmksDQogICAgICAgICAyOm5jb2woLikpICU+JSANCiAgZmlsdGVyKHNlY3RvciAlaW4lIGMoICJQbGFuIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICMgIkVOQVJTQSIsIkNBTU1FU0EiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIlN1YnNpZGlvcyBGRiBHTiB5IEdMUCIpKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKSAlPiUgDQogIGxlZnRfam9pbihnYW5hbmNpYV95X3BiaSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwYmkpKSAlPiUNCiAgbXV0YXRlKHN1YnNpZGlvc19wb3JjZW50YWplX3BiaT1hcy5kb3VibGUoc3Vic2lkaW9zX3BvcmNlbnRhamVfcGJpKSwNCiAgICAgICAgIHN1YnNpZGlvc19jZWZpcCA9IHN1YnNpZGlvc19wb3JjZW50YWplX3BiaS8xMDAgKiBwYmkgKiAxMF42KSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgICAgIHN1YnNpZGlvc19jZWZpcD1zdW0oc3Vic2lkaW9zX2NlZmlwLCBuYS5ybSA9IFQpKQ0KDQojZWplcyANCnN1YnNpZGlvc19lamVzIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvZWplcy9zdWJzaWRpb3MueGxzeCIgKSAlPiUgDQogIHJlbmFtZShzdWJzaWRpb3NfdXNkID0gc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgcmlnaHRfam9pbih0Y3BfYW51YWxfYiAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdGNjKSwgYnkgPSAiYW5pbyIpICU+JQ0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZSh1bmlkYWQgPSAiUGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBzdWJzaWRpb3NfZWplcyA9IHN1YnNpZGlvc191c2QqdGNjKjEwXjYpDQoNCnN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zIDwtIHN1YnNpZGlvc19lamVzJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBzdWJzaWRpb3NfZWplcykgJT4lIA0KICBmdWxsX2pvaW4oc3Vic2lkaW9zX2NlZmlwLCBieSA9YygiYW5pbyIsICJ1bmlkYWQiKSkgJT4lIA0KICBhcnJhbmdlKC1hbmlvKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiUGVzb3MgY29ycmllbnRlcyIpDQogICAgICAgICAjIHggPSBzdWJzaWRpb3NfY2VmaXAvc3Vic2lkaW9zX2VqZXMpDQpzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyAgDQpgYGANCg0KDQoNCiMgVmFsb3IgdG90YWwgZGUgbGEgcHJvZHVjY2nDs24gIA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojTUlQIDk3DQojIGNvZWZpY2llbnRlcyBkZSByZXF1ZXJpbWllbnRvcyBkaXJlY3Rvcw0KDQptaXBfOTcgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9taXAvbWlwX21hdHJpejEyLnhscyIsIA0KICAgIHNraXAgPSA3KSAlPiUgDQogIHNlbGVjdCgtIi4uLjEiKSAlPiUgDQogIHJlbmFtZShhY3RpdmlkYWQgPSAiLi4uMiIpDQogICMgZmlsdGVyKCIuLi4yIiAlaW4lIGMoICJVc29zIGRlIGxhIHByb2R1Y2Npw7NuIG5hY2lvbmFsIGEgcHJlY2lvcyBiw6FzaWNvcyIsICAiVmFsb3IgYnJ1dG8gZGUgbGEgcHJvZHVjY2nDs24gYSBwcmVjaW9zIGLDoXNpY29zIiApKQ0KDQpjaV9leHRyYWNjaW9uIDwtIG1pcF85N1tjKDEyNiwxNDkpLCBjKCJhY3RpdmlkYWQiICwgIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbywgZ2FzLCBjYXJiw7NuIHkgdXJhbmlvIildDQoNCmNvZWZfdGVjbmljb185NyA8LSBjaV9leHRyYWNjaW9uWzEsMl0vY2lfZXh0cmFjY2lvblsyLDJdDQoNCnggPC0gbWlwXzk3W2MoMTQwLCAxNDkpLF0gIyU+JSANCiAgICMgZ2F0aGVyKGtleSA9IHNlY3RvciwgdmFsdWUgPSB2YWxvciwgMjpuY29sKC4pKSAlPiUgDQoNCmltcF9wcm9tXzk3IDwtIGFwcGx5KFggPSB4WzEsMjpuY29sKHgpXS94WzIsMjpuY29sKHgpXSAsIE1BUkdJTiA9IDEgLCBGVU4gPSBmdW5jdGlvbih4KSBtZWFuKHgsIG5hLnJtPVQpICApDQogICAgDQoNCiMgY29lZiBDVU8gMjAwNCBhIHBhcnRpciBkZSBDSS9WQlANCiMgY29lZl90ZWNuaWNvIDwtICAwLjM2OTEwNDMwMg0KDQoNCiNQZXNvIGRlIGxvcyBzZXJ2aWNpb3MNCiNDVU8gDQojbGEgc3VtYSBkZSBsYXMgY29sdW1uYXMgbm9zIGRhIGVsIFZCUA0KQ09VIDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvbWlwL3NoX2NvdV8wNl8xNi54bHMiLCANCiAgICBza2lwID0gMikgJT4lDQogIHJlbmFtZShwcm9kdWN0byA9ICIuLi4xIiwNCiAgICAgICAgIGNwYyA9ICIuLi4yIikgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIlxcZCIpICYgIShzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiXk4iKSkpICU+JQ0KICBncm91cF9ieShwcm9kdWN0bykgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0Kc2VydmljaW9fc19leHRyYWNjaW9uIDwtICBzdW0oQ09VWzEyXSkvKCBzdW0oQ09VWzExXSkgKyBzdW0oQ09VWzEyXSkgKQ0KbnJvdyhDT1UpDQoNCg0KIyBEZXByZWNpYWNpw7NuIGRlbCBzdG9jaw0KY29uc3Vtb19rX2Zpam9feXBmIDwtIChyZWFkX2NzdigiLi4vZGF0YS9iYWxhbmNlcy9iYWxhbmNlc19hcmcuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUNCiAgZmlsdGVyKGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgZ3JvdXBfYnkoZW1wcmVzYSkgJT4lIA0KICBtdXRhdGUodGFzYV9kZXByZWNpYWNpb24gPSBkZXByZWNpYWNpb25lcy9wcHllKSAlPiUgDQogIHN1bW1hcmlzZSh0YXNhX2RlcHJlY2lhY2lvbiA9IG1lYW4oZGVwcmVjaWFjaW9uZXMvcHB5ZSkpKSR0YXNhX2RlcHJlY2lhY2lvbg0KDQp2YXIoKHJlYWRfY3N2KCIuLi9kYXRhL2JhbGFuY2VzL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JQ0KICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICBncm91cF9ieShmZWNoYSkgJT4lDQogIHN1bW1hcmlzZSh0YXNhX2RlcHJlY2lhY2lvbiA9IG1lYW4oZGVwcmVjaWFjaW9uZXMvcHB5ZSkpKSR0YXNhX2RlcHJlY2lhY2lvbikNCg0KDQoNCmBgYA0KDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0NDTk4gKGRhdG9zIG9maWNpYWxlcykNCiMjIEJhc2UgbWluZXLDrWENCmNjbm5fb2ZpY2lhbCA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL21lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIHNoZWV0ID0gIkN1ZW50YXMgTmFjaW9uYWxlcyIsIHNraXAgPSA1KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgcGVyaW9kbyA9IlBlcsOtb2RvIiwNCiAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICAiLi4uNSIsDQogICAgICAgIHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICAiLi4uMTUiKSAlPiUgDQogIGZpbHRlcihpcy5uYShwZXJpb2RvKSwgIWlzLm5hKGFuaW8pICkgJT4lICAjZmlsdHJhbW9zIGxvcyBkYXRvcyBhbnVhbGVzDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zPSBhcy5kb3VibGUodmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyksDQogICAgICAgICB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3M9IGFzLmRvdWJsZSh2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9IHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKiAoMSAtIHNlcnZpY2lvX3NfZXh0cmFjY2lvbiksDQogICAgICAgICB2YV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKiAoMSAtIHNlcnZpY2lvX3NfZXh0cmFjY2lvbiksDQogICAgICAgICBjaV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3M9DQogICAgICAgICAgIHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MtdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAtIHZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcykgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAsIA0KICAgICAgICAgdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAsIA0KICAgICAgICAgdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3gvMTBeM30pICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIGxlZnRfam9pbihtYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHVuaWRhZCwNCiAgICAgICAgICAgICAgICAgICAgIG1zX3RvdCA9IG1hc2Ffc2FsYXJpYWxfdG90YWxfb2VkZSwNCiAgICAgICAgICAgICAgICAgICAgIG1zX2V4dHIgPW1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbl9vZWRlICksIGJ5ID0gYygiYW5pbyIsICJ1bmlkYWQiKSkgJT4lIA0KICBtdXRhdGUoZWJlX3RvdCA9IHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAtIG1zX3RvdCwNCiAgICAgICAgIGViZV9leHRyID0gdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zIC1tc19leHRyLA0KICAgICAgICAgZnVlbnRlID0gIkNDTk4gb2ZpY2lhbCIgKSAlPiUgDQogIHJlbmFtZSh2YnBfZXh0ciA9IHZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyID0gY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmFfZXh0ciA9dmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmJwX3RvdD0gdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAsIA0KICAgICAgICAgdmFfdG90PSB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV90b3QgPSBjaV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgdW5ncm91cCgpDQpjY25uX29maWNpYWwNCg0KbWVhbl9jb2VmX21zIDwtICBjY25uX29maWNpYWwgJT4lIA0KICBzdW1tYXJpc2UoY29lZl9tc190b3QgPSBtZWFuKG1zX3RvdC92YnBfdG90LG5hLnJtPSBUKSwNCiAgICAgICAgICAgICAgY29lZl9tc19leHRyPSBtZWFuKG1zX2V4dHIvdmJwX2V4dHIgLG5hLnJtPSBUKSkNCg0KbWVkaWFuX2NvZWZfbXMgPC0gIGNjbm5fb2ZpY2lhbCAlPiUgDQogIHN1bW1hcmlzZShjb2VmX21zX3RvdCA9IG1lZGlhbihtc190b3QvdmJwX3RvdCxuYS5ybT0gVCksDQogICAgICAgICAgICAgIGNvZWZfbXNfZXh0cj0gbWVkaWFuKG1zX2V4dHIvdmJwX2V4dHIgLG5hLnJtPSBUKSkNCg0KIyAjIGVzdGltYWNpb24gcHJvcGlhIGNvZWYgdGVjbmljbw0KIyBjY25uX29maWNpYWwgJT4lIA0KIyAgIHN1bW1hcmlzZShjb2VmX3JlcV9leHRyX3lfc2VydiA9bWVhbihjaV9leHRyX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MvdmJwX2V4dHJfeV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcywgbmEucm09VCksDQojICAgICAgICAgIGNvZWZfcmVxX2V4dHIgPSBtZWFuKGNpX2V4dHJfaGlkcm9jYXJidXJvcy92YnBfZXh0cl9oaWRyb2NhcmJ1cm9zLCBuYS5ybT1UKSkNCg0KDQojIEJhc2UgSU5ERUMNCnggPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9pbmRlYy9zaF9WQlBfVkFCXzAzXzIxLnhscyIsIHNoZWV0ID0gMywgc2tpcCA9IDMpICU+JSANCiAgbmEub21pdCgpIA0KbmFtZXMoeCkgPC1jKCJzZWN0b3IiLCAyMDA0OjIwMjApDQp2YnBfY2NubiA8LSB4ICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sdmFsdWUgPSB2YnBfdG90ICwgMjpuY29sKC4pKQ0KDQp5IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvaW5kZWMvc2hfVkJQX1ZBQl8wM18yMS54bHMiLCBzaGVldCA9IDUsIHNraXAgPSA0KSAlPiUgDQogIHNlbGVjdCgxLCBjb250YWlucygiVG90YWwiKSkgJT4lIA0KICBuYS5vbWl0KCkgDQpuYW1lcyh5KSA8LWMoInNlY3RvciIsIDIwMDQ6MjAyMCkNCnZhX2Njbm4gPC0geSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLHZhbHVlID0gdmFfdG90ICwgMjpuY29sKC4pKQ0KDQpjY25uX29maWNpYWwgPC0gdmFfY2NubiAlPiUgDQogIGZpbHRlcihncmVwbCgiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIiwgc2VjdG9yKSkgJT4lIA0KICBpbm5lcl9qb2luKHZicF9jY25uICU+JSBmaWx0ZXIoZ3JlcGwoIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyIsIHNlY3RvcikpLCBieSA9IGMoInNlY3RvciIsICJhbmlvIikpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbykpICU+JSANCiAgbGVmdF9qb2luKG1hc2Ffc2FsYXJpYWxfaGlkcm9jYXJidXJvcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgdW5pZGFkLA0KICAgICAgICAgICAgICAgICAgICAgbXNfdG90ID0gbWFzYV9zYWxhcmlhbF90b3RhbF9vZWRlLA0KICAgICAgICAgICAgICAgICAgICAgbXNfZXh0ciA9bWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uX29lZGUgKSwgYnkgPSBjKCJhbmlvIikpICU+JSANCiAgbXV0YXRlKHZicF9leHRyID0gdmJwX3RvdCogKDEgLSBzZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgdmFfZXh0ciA9IHZhX3RvdCogKDEgLSBzZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgY2lfdG90ID0gdmJwX3RvdCAtIHZhX3RvdCwNCiAgICAgICAgIGNpX2V4dHIgPSB2YnBfZXh0ciAgLSB2YV9leHRyLA0KICAgICAgICAgZWJlX3RvdCA9dmFfdG90LW1zX3RvdCwNCiAgICAgICAgIGViZV9leHRyID0gdmFfZXh0ciAtbXNfZXh0ciwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgICBmdWVudGUgPSAiQ0NOTiBvZmljaWFsIiApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZnVlbnRlLCBldmVyeXRoaW5nKC4pLCAtc2VjdG9yKQ0KDQojIyBWQSB5IFZCUCBwcmVjaW9zIDkzDQp4IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvbWVjb24vUEJJX0Jhc2UgMTk5M19QTS54bHN4IiwgDQogICAgc2hlZXQgPSAiVkJQIGMiLCBjb2xfdHlwZXMgPSBjKCJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIpLCBza2lwID0gNikgJT4lIA0KICAgIHNlbGVjdCgxLCAhY29udGFpbnMoIkkiKSkNCm5hbWVzKHgpIDwtIGMoInNlY3RvciIsIDE5OTM6MjAwOSkNCnZicF85MyA8LSB4ICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sdmFsdWUgPSB2YnBfdG90ICwgMjpuY29sKC4pKQ0KDQp5IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvbWVjb24vUEJJX0Jhc2UgMTk5M19QTS54bHN4IiwgDQogICAgc2hlZXQgPSAiVkFCIGMiLCBza2lwID0gNikgJT4lIA0KICAgIHNlbGVjdCgxLCAhY29udGFpbnMoIkkiKSkNCm5hbWVzKHkpIDwtIGMoInNlY3RvciIsIDE5OTM6MjAwOSkNCnZhXzkzIDwtIHkgJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbyx2YWx1ZSA9IHZhX3RvdCAsIDI6bmNvbCguKSkNCg0KdmFsb3JfcHJvZHVjY2lvbl85MyA8LSB2YV85MyAlPiUgIGlubmVyX2pvaW4odmJwXzkzKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQpjb25zdW1vX2ludGVybWVkaW9fOTMgPC0gdmFsb3JfcHJvZHVjY2lvbl85MyAlPiUgDQogIGZpbHRlcihncmVwbCgiQyAtIEVYUExPVEFDSU9OIERFIE1JTkFTIFkgQ0FOVEVSQVMiLCBzZWN0b3IpKSAlPiUgDQogIG11dGF0ZShjb2VmX3RlY185MyA9IDEtKHZhX3RvdC92YnBfdG90KSwgDQogICAgICAgICAgIGNvZWZfdGVjXzkzX2luZGV4ID0gZ2VuZXJhcl9pbmRpY2UoY29lZl90ZWNfOTMsIGZlY2hhID0gYW5pbywgZmVjaGFfYmFzZSA9IDIwMDQpKQ0KICANCiMjIFNlcmllIGRlIENJDQojIDwgMTk5NyA6IE1JUCA5Nw0KIyA5NyBhIDIwMDQgOiBwcm9ncmVzaW9uIGRlIG1pcDk3IGEgaW5kZWMNCiMgMjAwNCBhIDIwMTk6IGluZGVjDQpjb2VmX2NvbnN1bW9faW50ZXJtZWRpbyA8LSBkYXRhLmZyYW1lKGFuaW8gPSAxOTYwOjIwMjApICU+JQ0KICBsZWZ0X2pvaW4oY2Nubl9vZmljaWFsICU+JSAgc2VsZWN0KGFuaW8sIHZicF90b3QsIHZhX3RvdCksIGJ5ID0gImFuaW8iKSAlPiUgDQogIGxlZnRfam9pbihjb25zdW1vX2ludGVybWVkaW9fOTMgJT4lIHNlbGVjdChhbmlvLCBjb2VmX3RlY185M19pbmRleCkpICU+JSANCiAgbXV0YXRlKGNvZWZfY2kgPSAxLSh2YV90b3QvdmJwX3RvdCkpDQpjaV9iYXNlID0gY29lZl9jb25zdW1vX2ludGVybWVkaW8kY29lZl9jaVtjb2VmX2NvbnN1bW9faW50ZXJtZWRpbyRhbmlvID09MjAwNF0NCg0KY29lZl9jb25zdW1vX2ludGVybWVkaW8gPC0gY29lZl9jb25zdW1vX2ludGVybWVkaW8gJT4lIA0KICBtdXRhdGUoY29lZl9jaSA9IGNhc2Vfd2hlbiggYW5pbyA8PSAyMDA0IH4gY29lZl90ZWNfOTNfaW5kZXggKiBjaV9iYXNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGNvZWZfY2kpKSAlPiUgDQogICAgICAgICAjIGNvZWZfY2kgPSBpbXB1dGVUUzo6bmEuaW50ZXJwb2xhdGlvbihjb2VmX2NpLCBvcHRpb24gPSAibGluZWFyIiApKSAlPiUgDQogIHNlbGVjdChhbmlvLCBjb2VmX2NpKQ0KY29lZl9jb25zdW1vX2ludGVybWVkaW8NCmBgYA0KDQojIyMgRXN0aW1hY2lvbmVzIHByb3BpYXMgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzdG9ja19lc3RpbWFkbyA9IHJlYWQuY3N2KCAiLi4vZGF0YS9iYWxhbmNlcy9zdG9ja19lc3RpbWFkbyh0ZW1wb3JhbCkuY3N2IikNCg0KI3ZhcmlhYmxlcyBwYXJhIGxhIGVzdGltYWNpw7NuIA0KcHJlY2lvc195X2NhbnRpZGFkZXMgPC0gcHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9jcnVkbyA9IHVuaWRhZCwgcHJvZF9jcnVkbykgJT4lDQogIGxlZnRfam9pbihleHBvX3FfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfY3J1ZG8gPXVuaWRhZCwgZXhwb19jcnVkbykpICU+JSANCiAgbGVmdF9qb2luKGV4aXN0ZW5jaWFzX3BldHJvbGVvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50X2NydWRvID0gdW5pZGFkLCBleGlzdGVuY2lhc19jcnVkbykpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4aXN0ZW5jaWFzX2NydWRvPTAgKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhwb19jcnVkbz0wICkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfcHJlY2lvX2NydWRvID0gdW5pZGFkLCBwcmVjaW9fY3J1ZG9fbWRvaW50KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX3ByZWNpb19jcnVkbyA9IHVuaWRhZCwgcHJlY2lvX21lX2NydWRvKSwgYnkgPSBjKCJhbmlvIiwgInVuaWRhZF9wcmVjaW9fY3J1ZG8iKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfZ2FzPSB1bmlkYWQscHJvZF9nYXMpLCBieSA9ICJhbmlvIikgJT4lDQogIGxlZnRfam9pbihleHBvX3FfZ2FzX01NQlRVICU+JSBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfZ2FzPSB1bmlkYWQsIGV4cG9fZ2FzKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9wcmVjaW9fZ2FzID0gdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMsIHByZWNpb19leHBvcnRhY2lvbl9nYXNfYXIpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX2dhc19tZG9pbnQpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB0Y3AsIHRjYyksIGJ5ID0gImFuaW8iKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvc195X2NhbnRpZGFkZXMsIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvaW5zdW1vc19jcml0ZXJpb19jY25uLnhsc3giKQ0KDQojIyBDcml0ZXJpbyBDQ05OIA0KY3JpdGVyaW9fY2NubiA8LSBwcmVjaW9zX3lfY2FudGlkYWRlcyAlPiUgDQogIGxlZnRfam9pbihjb2VmX2NvbnN1bW9faW50ZXJtZWRpbywgYnkgPSJhbmlvIikgJT4lIA0KICBtdXRhdGUoY3J1ZG9fbWRvX2ludGVybm8gPSBwcm9kX2NydWRvIC0gZXhwb19jcnVkbywNCiAgICAgICAgIGV4cG9fZ2FzID0gcmVwbGFjZV9uYShleHBvX2dhcywgMCApLA0KICAgICAgICAgZ2FzX21kb19pbnRlcm5vID0gcHJvZF9nYXMgLSBleHBvX2dhcywNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIA0KICAgICAgICAjIGNyaXRlcmlvIENDTk4NCiAgICAgICAgIHZicF90b3QgPSAoKGNydWRvX21kb19pbnRlcm5vKnByZWNpb19jcnVkb19tZG9pbnQrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvX2NydWRvKnByZWNpb19tZV9jcnVkbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2FzX21kb19pbnRlcm5vICogcHJlY2lvX2dhc19tZG9pbnQgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2V4cG9fZ2FzKnByZWNpb19leHBvcnRhY2lvbl9nYXNfYXIgKSp0Y2MpLzEwXjYsDQogICAgICAgICB2YnBfZXh0ciA9dmJwX3RvdCooMS1zZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgY2lfdG90ID0gdmJwX3RvdCAqY29lZl9jaSAsDQogICAgICAgICBjaV9leHRyID0gdmJwX2V4dHIgKiBjb2VmX2NpLA0KICAgICAgICB2YV90b3Q9ICAgdmJwX3RvdCAtIGNpX3RvdCwNCiAgICAgICAgdmFfZXh0cj0gICB2YnBfZXh0ciAtIGNpX2V4dHIsDQogICAgICAgIG1zX2V4dHIgPSB2YnBfZXh0ciAqIG1lYW5fY29lZl9tcyRjb2VmX21zX2V4dHIsDQogICAgICAgICBtc190b3QgPSB2YnBfdG90ICogbWVhbl9jb2VmX21zJGNvZWZfbXNfdG90LA0KICAgICAgICAgZWJlX3RvdCA9IHZhX3RvdCAtIG1zX3RvdCwNCiAgICAgICAgIGViZV9leHRyPXZhX2V4dHIgLSBtc190b3QgICwNCiAgICAgICAgZnVlbnRlID0gIkNyaXRlcmlvIENDTk4iKQ0KY3JpdGVyaW9fY2Nubg0KDQoNCiMgRW1wYWxtZSBDQ05ODQppbmRpY2VfdmJwX2NyaXRlcmlvX2Njbm4gPC0gY3JpdGVyaW9fY2NubiAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh2YnBfY3JpdGVyaW9fY2Nubl8wNCA9IGdlbmVyYXJfaW5kaWNlKHZicF90b3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDQpICkgJT4lICMgLA0KICAgICAgICAgIyB2YnBfY3JpdGVyaW9fY2Nubl8xMiA9IGdlbmVyYXJfaW5kaWNlKHZicF90b3QsDQogICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDEyKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdmJwX2NyaXRlcmlvX2Njbm5fMDQpDQoNCmVtcGFsbWVfY2NubiA8LSBjY25uX29maWNpYWwgJT4lIA0KICBmdWxsX2pvaW4oY29lZl9jb25zdW1vX2ludGVybWVkaW8sIGJ5ID0gImFuaW8iKSAlPiUgDQogIGZ1bGxfam9pbihpbmRpY2VfdmJwX2NyaXRlcmlvX2Njbm4sIGJ5ID0gImFuaW8iKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBtdXRhdGUodmJwX2V4dHIgPSBjYXNlX3doZW4oYW5pbyA8IDIwMDQgfiBjY25uX29maWNpYWwkdmJwX2V4dHJbY2Nubl9vZmljaWFsJGFuaW8gPT0gMjAwNF0gKiB2YnBfY3JpdGVyaW9fY2Nubl8wNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YnBfZXh0cikgLA0KICAgIHZicF90b3QgPSBjYXNlX3doZW4oIGFuaW8gPCAyMDA0IH4gY2Nubl9vZmljaWFsJHZicF90b3RbY2Nubl9vZmljaWFsJGFuaW8gPT0gMjAwNF0gKiB2YnBfY3JpdGVyaW9fY2Nubl8wNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YnBfdG90KSwNCiAgICBjaV9leHRyID0gdmJwX2V4dHIgKiBjb2VmX2NpICwNCiAgICBjaV90b3QgPSB2YnBfdG90ICpjb2VmX2NpICAgLA0KICAgIHZhX3RvdCA9IGNhc2Vfd2hlbihpcy5uYSh2YV90b3QpIH4gdmJwX3RvdCAtIGNpX3RvdCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YV90b3QpLA0KICAgIHZhX2V4dHIgPSBjYXNlX3doZW4oaXMubmEodmFfZXh0cikgfiB2YnBfZXh0ciAtIGNpX2V4dHIgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFfZXh0ciksDQogICAgbXNfdG90ID0gY2FzZV93aGVuKGlzLm5hKG1zX3RvdCkgfiB2YnBfdG90Km1lYW5fY29lZl9tcyRjb2VmX21zX3RvdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IG1zX3RvdCkgLA0KICAgIG1zX2V4dHIgPSBjYXNlX3doZW4oaXMubmEobXNfZXh0cikgfiB2YnBfdG90Km1lYW5fY29lZl9tcyRjb2VmX21zX2V4dHIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBtc19leHRyKSwgDQogICAgZWJlX3RvdCA9IGNhc2Vfd2hlbihpcy5uYShlYmVfdG90KSB+IHZhX3RvdCAtbXNfdG90LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZWJlX3RvdCksDQogICAgZWJlX2V4dHIgPSBjYXNlX3doZW4oaXMubmEoZWJlX2V4dHIpIH4gdmFfZXh0ciAtbXNfZXh0ciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGViZV9leHRyKSwNCiAgICBmdWVudGUgPSAiRW1wYWxtZSBDQ05OIiwNCiAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgIGxlZnRfam9pbihzdG9ja19lc3RpbWFkbyAlPiUNCiAgICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKGZ1ZW50ZV9wcHllID09ICJCb2xzYXIiKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKGNvbnN1bW9fa19maWpvID0gdmFsb3IgKiBpcGNfMTggKiBjb25zdW1vX2tfZmlqb195cGYpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjb25zdW1vX2tfZmlqbykpICU+JQ0KICBtdXRhdGUoIHB2ID0gZWJlX2V4dHIgLSBjb25zdW1vX2tfZmlqbyAtICh2YnBfdG90ICogaW1wX3Byb21fOTcpKQ0KDQplbXBhbG1lX2Njbm4NCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyBDcml0ZXJpbyBwcm9waW8gDQpjcml0ZXJpb19wcm9waW8gPC0gcHJlY2lvc195X2NhbnRpZGFkZXMgJT4lDQogIGxlZnRfam9pbihlbXBhbG1lX2Njbm4gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbyx1bmlkYWQsIGNpX3RvdCwgY2lfZXh0ciwgbXNfdG90LCBtc19leHRyICkgKSAlPiUgDQogIGxlZnRfam9pbihzdG9ja19lc3RpbWFkbyAlPiUNCiAgICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgICAgICAgICAgICAgIyBmaWx0ZXIodmFyaWFibGUgPT0gInBweWVfZXN0aW1hZG9fYm9sc2FyIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihmdWVudGVfcHB5ZSA9PSAiQm9sc2FyIikgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoY29uc3Vtb19rX2Zpam8gPSB2YWxvciAqIGlwY18xOCAqIGNvbnN1bW9fa19maWpvX3lwZikgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNvbnN1bW9fa19maWpvKSkgJT4lIA0KICBtdXRhdGUoDQogICAgICAgICMgY3JpdGVyaW8gcHJvcGlvDQogICAgICAgICB2YnBfdG90ID0oIChwcm9kX2NydWRvKnByZWNpb19tZV9jcnVkbyAgKyBwcm9kX2dhcyAqIHByZWNpb19leHRlcm5vX2dhcykgKiB0Y3ApLzEwXjYsDQogICAgICAgICB2YV90b3QgPSB2YnBfdG90IC0gY2lfZXh0ciwNCiAgICAgICAgIGViZV90b3QgPSB2YV90b3QgLSBtc19leHRyICwNCiAgICAgICAgIHZicF9leHRyID0gIE5BICwNCiAgICAgICAgIGViZV9leHRyID1OQSwNCiAgICAgICAgIHZhX2V4dHI9TkEsIA0KICAgICAgICAgZnVlbnRlID0gIkNyaXRlcmlvIHByb3BpbyIsIHVuaWRhZCA9Ik1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiICwNCiAgICAgICAgICBwdiA9IGViZV90b3QgLSBjb25zdW1vX2tfZmlqbyAtICh2YnBfdG90ICogaW1wX3Byb21fOTcpKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpmaWx0cm8gPC0gYygiYW5pbyIsICJ1bmlkYWQiLCAiZnVlbnRlIiwgInZicF90b3QiLCAidmJwX2V4dHIiLA0KICAgICAgICAgICAgImNpX3RvdCIsICJjaV9leHRyIiwgICJtc190b3QiLCAibXNfZXh0ciIsDQogICAgICAgICAgICAidmFfdG90IiwgICJ2YV9leHRyIiAsICJlYmVfdG90IiwgImViZV9leHRyIiAgKQ0KDQp2YWxvcl90b3RhbF9wcm9kdWNjaW9uX2NvcnIgPC0gY2Nubl9vZmljaWFsICU+JSANCiAgc2VsZWN0KGZpbHRybykgJT4lIA0KICAjIHJiaW5kKGNyaXRlcmlvX2Njbm4gJT4lc2VsZWN0KGZpbHRybykpICU+JSANCiAgcmJpbmQoZW1wYWxtZV9jY25uICU+JSBzZWxlY3QoZmlsdHJvKSkgJT4lIA0KICByYmluZChjcml0ZXJpb19wcm9waW8gJT4lIHNlbGVjdChmaWx0cm8pKSAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwgdmFsdWU9dmFsb3IsIDQ6MTIpIA0KDQp2YWxvcl90b3RhbF9wcm9kdWNjaW9uIDwtICB2YWxvcl90b3RhbF9wcm9kdWNjaW9uX2NvcnIgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC9pcGNfMTgsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpDQoNCg0KIyB3cml0ZS5jc3YoIHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24sIGZpbGUgPSAiLi4vcmVzdWx0YWRvcy9kYXRhX3Zpei92YWxvcl90b3RhbF9wcm9kdWNjaW9uLmNzdiIsIHJvdy5uYW1lcyA9IEYpDQoNCg0KDQpgYGANCg0KDQoNCg0KIyBUYXNhIGRlIEdhbmFuY2lhDQoNCg0KJCRUR197aGlkcm9jYXJidXJvc30gPSBcZnJhY3tQVl97aGlkcm9jYXJidXLDrWZlcmF9fXtLVEFfe2hpZHJvY2FyYnVyw61mZXJvfX0kJA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojbGV2YW50byBkYXRhIHNldHMgZGUgb3RybyBSIG1hcmtkb3duDQpiYWxhbmNlc19hcmcgPC0gcmVhZF9jc3YoIi4uL2RhdGEvYmFsYW5jZXMvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoZmVjaGEgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJVktJW0tJWQiKSwgWDEgPSBjb2xfc2tpcCgpKSkNCg0KcGV0cm9icmFzX2FyZ19zZWdtZW50b3MgPC0gcmVhZF9jc3YoIi4uL2RhdGEvYmFsYW5jZXMvcGV0cm9icmFzX2FyZ19zZWdtZW50b3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKQ0KDQp5cGZfc2VnbWVudG9zIDwtIHJlYWRfY3N2KCIuLi9kYXRhL3lwZi95cGZfc2VnbWVudG9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkNCg0KYGBgDQoNCiMjVG90YWwgcmFtYQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICAgLGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01fQ0KDQp0YXNhX2dhbmFuY2lhX3JhbWEgPC0gZW1wYWxtZV9jY25uICU+JQ0KICBkaXN0aW5jdCgpICU+JSANCiAgICBmaWx0ZXIoYW5pbyA+MTk5NykgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwdikgJT4lIA0KICAgICMgbGVmdF9qb2luKHN0b2NrX3lfcG96b3MgJT4lIA0KICAjICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHB5ZSA9IHBweWVfZXN0aW1hZG8sIHN0b2NrX3NlbGVjY2lvbmFkbyA9IGZ1ZW50ZV9wcHllLCBmdWVudGVfcG96byksDQogICMgICAgICAgICAgIGJ5ID0gYygiYW5pbyIpKSAlPiUgDQogIGxlZnRfam9pbihzdG9ja19lc3RpbWFkbyAlPiUNCiAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAsIGJ5ID0gImFuaW8iKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZV9wb3pvID0gIkVzdGltYWNpw7NuIHNpbiBwb3pvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yID0gdmFsb3IgKmlwY18xOCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHB5ZSA9IHZhbG9yLCBzdG9ja19zZWxlY2Npb25hZG8gPSBmdWVudGVfcHB5ZSwgZnVlbnRlX3Bvem8pLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSANCiAgbXV0YXRlKHRhc2FfZ2FuYW5jaWEgPSBwdi9wcHllKSAlPiUgDQogIGZpbHRlcighaXMubmEoc3RvY2tfc2VsZWNjaW9uYWRvKSkgJT4lIA0KICBzZWxlY3QoLWZ1ZW50ZV9wb3pvKQ0KDQojIGdyYWZfdGdfcmFtYV8xIDwtIHRhc2FfZ2FuYW5jaWFfcmFtYSU+JQ0KIyAgIGdncGxvdChhZXMoYW5pbywgdGFzYV9nYW5hbmNpYSwgY29sb3IgPXN0b2NrX3NlbGVjY2lvbmFkbyApKSsNCiMgICBnZW9tX2xpbmUoYWxwaGEgPSAwLjUpKw0KIyAgIGdlb21fcG9pbnQoKSsNCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiMgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGhpZHJvY2FyYnVyw61mZXJhIGNvbiBQUHlFIGRlIGV4dHJhY2Npw7NuIikNCiMgICAjIGZhY2V0X3dyYXAofnN0b2NrX3NlbGVjY2lvbmFkbykNCiMgIyBnZ3Bsb3RseShncmFmX3RnX3JhbWFfMSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCiMgZ3JhZl90Z19yYW1hXzENCg0KIyMjIyMjIyMjIyMjDQoNCiMgI2VsIERGIHRhc2FfZ2FuYW5jaWFfcmFtYV9zdG9jayBjb250aWVuZSBsYXMgZXN0aW1hY2lvbmVzIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMgZGUgS1RBIGNvbiBzdG9jayBkZSBwb3pvcw0KdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrIDwtIHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gJT4lDQogICMgZmlsdGVyKHZhcmlhYmxlID09ICJleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24iICYgZnVlbnRlID09ICJDcml0ZXJpbyBwcm9waW8gY29uIFZCUCBDQ05OIiApICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgPT0gImViZV90b3QiICYgZnVlbnRlID09ICJDcml0ZXJpbyBwcm9waW8iICkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiA9IHZhbG9yKSAlPiUNCiAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JQ0KICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoInBweWVfZXN0aW1hZG9fYWZpcCIsICJwcHllX2VzdGltYWRvX2JvbHNhciIsDQogICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAicHB5ZV9lc3RpbWFkb190b3RhbCIpKSAlPiUNCiAgICAgICAgICAgICAgIyBmaWx0ZXIodmFyaWFibGUgPT0gInBweWVfZXN0aW1hZG9fYm9sc2FyIikgJT4lDQogICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX3RvdGFsIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsICBwcHllID0gdmFsb3IsIHN0b2NrX3NlbGVjY2lvbmFkbyA9IGZ1ZW50ZV9wcHllKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikpICU+JQ0KICBtdXRhdGUodGFzYV9nYW5hbmNpYSA9IGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbi9wcHllKQ0KIA0KZ3JhZl90Z19yYW1hXzIgPC0gdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrICU+JQ0KICBmaWx0ZXIoYW5pbyA+MTk5NSkgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdGFzYV9nYW5hbmNpYSwgY29sb3IgPSBzdG9ja19zZWxlY2Npb25hZG8pKSsNCiAgZ2VvbV9saW5lKGFscGhhID0gMC41KSsNCiAgZ2VvbV9wb2ludCgpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGhpZHJvY2FyYnVyw61mZXJhIGNvbiBQUHlFIGEgcGFydGlyIGRlIHN0b2NrIGRlIHBvem9zICgxOTYwIC0gMjAxOCkiKQ0KIyBnZ3Bsb3RseShncmFmX3RnX3JhbWFfMiwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCmdyYWZfdGdfcmFtYV8yDQoNCmBgYA0KDQojIyBSZW50YSBhcHJvcGlhZGEgcG9yIGxhcyBlbXByZXNhcyBkZSBsYSByYW1hDQoNCkxhIHJlbnRhIGFwcm9waWFkYSBwb3IgbGFzIGVtcHJlc2FzIGRlIGxhIHJhbWEgc2UgY2FsY3VsYSBwb3IgbWVkaW8gZGVsIGRpZmVyZW5jaWFsIGRlIHRhc2FzIGRlIGdhbmFuY2lhIGVudHJlIGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyBxdWUgc3VyZ2UgYSBwYXJ0aXIgZGUgbG9zIGJhbGFuY2VzIHkgbGEgcmVudGFiaWxpZGFkIG5vcm1hbCBkZSBsYSBlY29ub23DrWEuDQoNCiQkUmVudGFcX2VtcHJlc2FzID0gS1RBX3toaWRyb2NhcmJ1csOtZmVyb30gKiAoVEdfe2hpZHJvY2FyYnVyw61mZXJhfSAtIFRHX3tyZWZlcmVuY2lhfSkkJA0KJCRUR197aGlkcm9jYXJidXLDrWZlcmF9ID0gXGZyYWN7R2NpYV97aGlkcm9jYXJidXJvc319e0tUQV97aGlkcm9jYXJidXLDrWZlcm99fSQkIA0KUG9yIGxvIGN1YWwsIGxhIHJlbnRhIGFwcm9waWFkYSBwb3IgbGFzIGVtcHJlc2FzIGRlIGxhIHJhbWEgc2Vyw61hIGVxdWl2YWxlbnRlIGE6DQoNCiQkUmVudGFcX2VtcHJlc2FzID0gR2NpYV97aGlkcm9jYXJidXJvc30gLSBLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSAqICBUR197cmVmZXJlbmNpYX0kJA0KDQpEb25kZToNCg0KKiAkS1RBX3toaWRyb2NhcmJ1csOtZmVyb30kID0gU3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIGRlIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcw0KKiAkVEdfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBUYXNhIGRlIGdhbmFuY2lhIGRlIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcw0KKiAkVEdfe3JlZmVyZW5jaWF9JCA9IFRhc2EgZGUgZ2FuYW5jaWEgZGUgcmVmZXJlbmNpYQ0KKiAkR2NpYV97aGlkcm9jYXJidXJvc30kID0gR2FuYW5jaWEgZGUgZW1wcmVzYXMgaGlkcm9jYXJidXLDrWZlcmFzDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiAgDQp0Z19pbmR1c3RyaWFsIDwtIHJlYWRfZGVsaW0oIi4uL2RhdGEvY2Nubi90Z19pbmR1c3RyaWFsLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkNCg0KcmVudGFfdGcgPC0gIHRhc2FfZ2FuYW5jaWFfcmFtYSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgc3RvY2tfc2VsZWNjaW9uYWRvLCAgcHB5ZSAsIHRhc2FfZ2FuYW5jaWEpICU+JSANCiAgIyBmaWx0ZXIoc3RvY2tfc2VsZWNjaW9uYWRvID09ICJwcHllX2JvbHNhciIsZnVlbnRlX3Bvem8gPT0gInBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhIiApICU+JSANCiAgbGVmdF9qb2luKHRnX2luZHVzdHJpYWwsIGJ5ID0gImFuaW8iKSAlPiUgDQogIHJlbmFtZSh0Z19oaWRyb2NhcmJ1cm9zID0gdGFzYV9nYW5hbmNpYSkgJT4lIA0KICBtdXRhdGUodW5pb25fdGcgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTMgfiB0Z19pbmR1X2ppYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5MyB+IHRnX2luZHVfZW0pLA0KICAgICAgICAgcmVudGFfY29uX3RnX2ppYyA9IHBweWUgKih0Z19oaWRyb2NhcmJ1cm9zIC0gdGdfaW5kdV9qaWMpLA0KICAgICAgICAgcmVudGFfY29uX3RnX2VtID0gcHB5ZSAqKHRnX2hpZHJvY2FyYnVyb3MgLSB0Z19pbmR1X2VtKSwNCiAgICAgICAgIHJlbnRhX2Nvbl90Z191bmlvbiA9IHBweWUgKih0Z19oaWRyb2NhcmJ1cm9zIC0gdW5pb25fdGcpKSAlPiUgDQogIGRpc3RpbmN0KCkNCg0KIyBncmFmX3RnX3JhbWEgPC0gcmVudGFfdGcgJT4lDQojICAgZmlsdGVyKCFpcy5uYShzdG9ja19zZWxlY2Npb25hZG8pKSAlPiUgDQojICAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQojICAgICAgICAgIHZhbHVlID0gcmVudGEsDQojICAgICAgICAgIGMocmVudGFfY29uX3RnX2ppYywgcmVudGFfY29uX3RnX2VtLHJlbnRhX2Nvbl90Z191bmlvbiApKSAlPiUgDQojICAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiMgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KIyAgIG11dGF0ZShyZW50YSA9IHJlbnRhL2lwY18xOCkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrIA0KIyAgIGdlb21fY29sKHBvc2l0aW9uID0iZG9kZ2UiKSsNCiMgICAjIGdlb21fcG9pbnQoKSsNCiMgICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHBvciBkaWZlcmVuY2lhbCBkZSB0YXNhcyBkZSBnYW5hbmNpYSIsDQojICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrICBmYWNldF93cmFwKH5zdG9ja19zZWxlY2Npb25hZG8sIG5jb2wgPSAxKQ0KIyBnZ3Bsb3RseShncmFmX3RnX3JhbWEsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpyZW50YV9lbXByZXNhc19iYWxhbmNlcyA8LSByZWFkX2NzdigiLi4vZGF0YS9iYWxhbmNlcy9yZW50YV9lbXByZXNhLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgDQoNCnJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgPC0gIHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzICU+JSANCiAgZmlsdGVyKCEoZW1wcmVzYSAlaW4lIGMoImNoZXZyb25fZ2xvYmFsIiwgInBldHJvYnJhc19nbG9iYWwiICkpLA0KICAgICAgICAgc2VjdG9yICVpbiUgYyggImludGVncmFkYSIsICJwcm9kdWNjaW9uIikNCiAgICAgICAgICkgJT4lIA0KICByZW5hbWUodW5pZGFkID0gbW9uZWRhKSAlPiUgDQogIGdyb3VwX2J5KGZlY2hhLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKEtUQSA9IHN1bShLVEEsIG5hLnJtID0gVCksDQogICAgICAgICAgICBnYW5hbmNpYV9lbXByZXNhc19hbnRlc19pbXB1ZXN0b3MgPSBzdW0oZ2NpYV9hbnQsIG5hLnJtID0gVCksDQogICAgICAgICAgICAjIGdhbmFuY2lhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID0gc3VtKGdjaWFfZGVzcCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHJlbnRhX2VtcHJlc2FzX2FudGVzX2ltcHVlc3RvcyA9IHN1bShyZW50YV9hbnRfY29yciwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID0gc3VtKHJlbnRhX2Rlc3BfY29yciwgbmEucm0gPSBUKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoIGFuaW8gPSBsdWJyaWRhdGU6OnllYXIoZmVjaGEpKSAlPiUgDQogIHNlbGVjdChhbmlvLCBldmVyeXRoaW5nKC4pLCAtZmVjaGEpDQoNCiMgZ3JhZl9yZW50YV9lbXAgPC0gcmVudGFfZW1wcmVzYXNfYmFsYW5jZXMgJT4lDQojICAgZmlsdGVyKHNlY3RvciAhPSAiZGlzdHJpYnVjaW9uIikgJT4lIA0KIyAgIGZpbHRlcighaXMubmEocmVudGFfZGVzcF9wMTgpLA0KIyAgICAgICAgICAhKGVtcHJlc2EgJWluJSBjKCJjaGV2cm9uX2dsb2JhbCIsICJwZXRyb2JyYXNfZ2xvYmFsIiApKSkgJT4lIA0KIyAgIGdncGxvdChhZXMoZmVjaGEsIHJlbnRhX2Rlc3BfcDE4LCBmaWxsID0gZW1wcmVzYSkpICsgDQojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siKSsNCiMgICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHBvciBlbXByZXNhIiwNCiMgICAgICAgIHN1YnRpdGxlID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKSsNCiMgICBmYWNldF93cmFwKH5zZWN0b3IpDQojIA0KIyBnZ3Bsb3RseShncmFmX3JlbnRhX2VtcCwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KYGBgDQoNCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQplamVyY2ljaW8gPC0gdmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAidmFfdG90IikgJT4lIA0KICAjIGZ1bGxfam9pbihzdG9ja19yYW1hICU+JQ0KICAjICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByYW1hID0gc2VjdG9yLCBhY3Rpdm9zID0gdmFyaWFibGUsIHZhbG9yX2FjdGl2b3MgPSB2YWxvciwgDQogICMgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZV9hY3Rpdm9zID0gZnVlbnRlKSAlPiUgDQogICMgICAgICAgICAgICAgIyBmaWx0ZXIoZnVlbnRlX2FjdGl2b3MgPT0gIkFGSVAiKSklPiUNCiAgIyAgICAgICAgICAgICBmaWx0ZXIoZnVlbnRlX2FjdGl2b3MgPT0gIkJvbHNhciIpKSU+JQ0KICBmdWxsX2pvaW4oc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihlbXByZXNhID09ICJZUEYiKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByYW1hID0gc2VjdG9yLCBhY3Rpdm9zID0gdmFyaWFibGUsIHZhbG9yX2FjdGl2b3MgPSB2YWxvcikpICU+JSANCiAgICAgICAgICAgICAgIyBmaWx0ZXIoZnVlbnRlX2FjdGl2b3MgPT0gIkJvbHNhciIpKSU+JQ0KICBtdXRhdGUocmVsYWNpb24gPSB2YWxvcl9hY3Rpdm9zL3ZhbG9yKSAlPiUgDQogIGZpbHRlcihhbmlvID4gMTk5MCwgIShpcy5uYShhY3Rpdm9zKSkpDQplamVyY2ljaW8gICAgICAgICAgICANCiAgDQojIGdyYWZfcmVsYWNpb24gPC0gZWplcmNpY2lvICU+JSANCiMgICAjIGdncGxvdCggYWVzKGFuaW8sIHJlbGFjaW9uLCBjb2xvciA9IHJhbWEpKSsNCiMgICBnZ3Bsb3QoIGFlcyhhbmlvLCByZWxhY2lvbiwgY29sb3IgPSBmdWVudGUpKSsNCiMgICAjIGdlb21fbGluZSgpKw0KIyAgIGdlb21fcG9pbnQoKSsNCiMgICB0aGVtZV9jbGFzc2ljKCkrDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnModGl0bGUgPSAiQWN0aXZvIHNvYnJlIHZhbG9yIGFncmVnYWRvIikrDQojICAgZmFjZXRfd3JhcCh+YWN0aXZvcykgDQojIA0KIyAgIGdncGxvdGx5KGdyYWZfcmVsYWNpb24sIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KYGBgDQoNCg0KDQojIFJlbnRhIHBvciBlbCBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGVudHJlIGVsIG1lcmNhZG8gaW50ZXJubyB5IGxhcyByZWZlcmVuY2lhcyBpbnRlcm5hY2lvbmFsZXMgDQoNClJlbnRhIGFwcm9waWFkYSBtZWRpYW50ZSBlbCBhYmFyYXRhbWllbnRvIGVuIGVsIGNvbnN1bW8gaW50ZXJubyBwb3IgZWZlY3RvIGRlbCBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8vZXh0ZXJubywgc29icmV2YWx1YWNpw7NuIGRlIGxhIG1vbmVkYSB5IHJldGVuY2lvbmVzIGEgbGEgZXhwb3J0YWNpw7NuDQoNCg0KIyMjIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIEpLICh2YXJpYWJsZSAncmVudGFfZGlmX3ByZWNpb3MnKQ0KDQokJFJEUD0gUHJvZEludCAqIFBleHQgKiBUQ1AgLSBQcm9kSW50ICogUE1JICogVENDJCQNCg0KRG9uZGU6DQoNCiogJFJEUCQgPSBSZW50YSBhcHJvcGlhZGEgcG9yIGVmZWN0byBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8vZXh0ZXJubyB5IHNvYnJldmFsdWFjacOzbg0KKiAkTWRvSW50JCA9IFByb2R1Y2Npw7NuIGRlc3RpbmFkYSBhbCBNZXJjYWRvIEludGVybm86IFByb2R1Y2Npw7NuIC0gRXhwb3J0YWNpb25lcyAtIEV4aXN0ZW5jaWFzIChiYXJyaWxlcyBkZSBwZXRyw7NsZW8gw7MgTU1CVFUpDQoqICRQZXh0JCA9IFByZWNpbyBkZSByZWZlcmVuY2lhIGRlbCBtZXJjYWRvIGV4dGVybm8gKFVTRCkNCiogJFBNSSQgPSBQcmVjaW8gZGUgdmVudGEgZGVsIG1lcmNhZG8gaW50ZXJubyAoVVNEKQ0KKiAkVENQJCA9IFRpcG8gZGUgQ2FtYmlvIGRlIFBhcmlkYWQNCiogJFRDQyQgPSBUaXBvIGRlIENhbWJpbyBDb21lcmNpYWwNCg0KIyMjIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIEpJQyB5IGNpYSAodmFyaWFibGUgJ3JlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24nKQ0KJCRSRFAgPSBNZG9JbnQgKiBQTUkgKiAoXGZyYWN7VENQfXtUQ0N9ICAtIDEpJCQgIA0KDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpyZW50YV9kaWZfcHJlY2lvc19jcnVkbyA8LSBwcm9kX21lcmdlX2NydWRvICU+JSANCiAgIyBmaWx0ZXIoYW5pbyA+IDE5OTApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJvZF9jcnVkbykgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19xX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19jcnVkbykpICU+JSAjdW5pb24gY29uIGV4cG8NCiAgbGVmdF9qb2luKGV4aXN0ZW5jaWFzX3BldHJvbGVvKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChleGlzdGVuY2lhc19jcnVkbz0wICkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4cG9fY3J1ZG89MCApKSAlPiUgDQogICMgbXV0YXRlKHByb2RfbWRvX2ludGVybm8gPSBwcm9kX2NydWRvIC0gZXhwb19jcnVkbyAtIGV4aXN0ZW5jaWFzX2NydWRvKSAlPiUgDQogIG11dGF0ZShwcm9kX21kb19pbnRlcm5vID0gcHJvZF9jcnVkbyAtIGV4cG9fY3J1ZG8gKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX2NydWRvX21kb2ludCksDQogICAgICAgICAgICBieSA9IGMoImFuaW8iKSkgJT4lICAjIHVubyBjb24gcHJlY2lvIGludGVybm8NCiAgbGVmdF9qb2luKHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoYnJlbnQgPSBjYXNlX3doZW4oYW5pbyA8IDE5ODcgfiBicmVudF9oaXN0b3JpYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk4NyB+IGJyZW50X2llYSApKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fbWVfY3J1ZG8sIGJyZW50ICksDQogICAgICAgICAgICBieSA9IGMoImFuaW8iKSkgJT4lICAgIyB1bm8gY29uIHByZWNpbyBleHRlcm5vIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19jcnVkbyA9IHByb2RfbWRvX2ludGVybm8qcHJlY2lvX21lX2NydWRvKnRjcCAtIHByb2RfbWRvX2ludGVybm8qcHJlY2lvX2NydWRvX21kb2ludCp0Y2MsDQogICAgICAgICByZW50YV9kaWZfcHJlY2lvc19icmVudCA9IHByb2RfbWRvX2ludGVybm8qYnJlbnQqdGNwIC0gcHJvZF9tZG9faW50ZXJubypwcmVjaW9fY3J1ZG9fbWRvaW50KnRjYywNCiAgICAgICAgICMgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbiA9IHByb2RfbWRvX2ludGVybm8gKnByZWNpb19jcnVkb19tZG9pbnQodGNwL3RjYy0xKSwNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAiVVNEIiwgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudGlkYWQ9IHVuaWRhZCAsIHByb2RfY3J1ZG8sIGV4cG9fY3J1ZG8sIGV4aXN0ZW5jaWFzX2NydWRvLCBwcm9kX21kb19pbnRlcm5vLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbywgcHJlY2lvX2ludGVybm9fY3J1ZG8gPSBwcmVjaW9fY3J1ZG9fbWRvaW50LCBwcmVjaW9fZXh0ZXJub19jcnVkbyA9IHByZWNpb19tZV9jcnVkbywNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLCANCiAgICAgICAgICMgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9jcnVkbyA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24sDQogICAgICAgICByZW50YV9kaWZfcHJlY2lvc19jcnVkbywgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQpIA0KDQoNCg0KDQojIGdyYWZfZGlmX2NydWRvIDwtIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICU+JQ0KIyAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiMgICBtdXRhdGUocmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPSByZW50YV9kaWZfcHJlY2lvc19jcnVkby9pcGNfMTgsDQojICAgICAgICAgIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50ID0gcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQvaXBjXzE4KSAlPiUNCiMgICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lDQojICAgc2VsZWN0KGFuaW8sIDEyOm5jb2woLikgKSAlPiUNCiMgICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMzo0KSAlPiUNCiMgICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIDEwXjYpICU+JQ0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiMgICBsYWJzKHRpdGxlID0gIlJlbnRhIHBldHJvbGVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vIHkgZXh0ZXJubyIsDQojICAgICAgICB5ID0gIk1NIGRlIHBlc29zIGRlIDIwMTgiKQ0KIyBncmFmX2RpZl9jcnVkbw0KDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzIDwtIHByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJvZF9nYXMpICU+JSANCiAgbGVmdF9qb2luKGV4cG9fcV9nYXNfTU1CVFUgJT4lIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fZ2FzKSkgJT4lIA0KICBtdXRhdGUoZXhwb19nYXMgPSByZXBsYWNlX25hKGV4cG9fZ2FzLCAwICksDQogICAgICAgIHByb2RfbWRvX2ludGVybm8gPSBwcm9kX2dhcyAtIGV4cG9fZ2FzKSAlPiUNCiAgbGVmdF9qb2luKHByZWNpb19taV9nYXNfTU1CVFUgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvICwgcHJlY2lvX2ludGVybm9fZ2FzID0gIHByZWNpb19nYXNfbWRvaW50KSwNCiAgICAgICAgICAgIGJ5ID0gImFuaW8iKSAlPiUgICMgdW5vIGNvbiBwcmVjaW8gaW50ZXJubw0KICBsZWZ0X2pvaW4ocHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX2V4dGVybm9fZ2FzKSwgDQogICAgICAgICAgICBieSA9ICJhbmlvIikgJT4lICAgIyB1bm8gY29uIHByZWNpbyBleHRlcm5vDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JQ0KICBtdXRhdGUoDQogICAgcHJlY2lvX2ludGVybm9fZ2FzID0gcHJlY2lvX2ludGVybm9fZ2FzLyB0Y2MsDQogICAgcmVudGFfZGlmX3ByZWNpb3NfZ2FzID0gcHJvZF9tZG9faW50ZXJubyAqIHRjcCAqIHByZWNpb19leHRlcm5vX2dhcw0KICAgICAgLSBwcm9kX21kb19pbnRlcm5vICogdGNjICogcHJlY2lvX2ludGVybm9fZ2FzICwNCiAgICByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uID0gcHJvZF9tZG9faW50ZXJubyAqIHByZWNpb19pbnRlcm5vX2dhcyoodGNwL3RjYy0xKSwNCiAgICAgIHVuaWRhZF9wcmVjaW8gPSAiVVNEIiwgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudGlkYWQ9IHVuaWRhZCAsIHByb2RfZ2FzLCBleHBvX2dhcywgcHJvZF9tZG9faW50ZXJubywgDQogICAgICAgICB1bmlkYWRfcHJlY2lvLCBwcmVjaW9faW50ZXJub19nYXMsIHByZWNpb19leHRlcm5vX2dhcywgdGNjLCB0Y3AsDQogICAgICAgICB1bmlkYWRfcmVudGEsIHJlbnRhX2RpZl9wcmVjaW9zX2dhcywgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMgPSByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uICkNCnJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzDQoNCg0KDQojIGdyYWZfZGlmX2dhcyA8LSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUNCiMgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQojICAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2dhcyA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9pcGNfMTgsDQojICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzID0NCiMgICAgICAgICAgICByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcy9pcGNfMTgpICU+JQ0KIyAgICAgc2VsZWN0KGFuaW8sIDExOm5jb2woLikgKSAlPiUNCiMgICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMzo0KSAlPiUNCiMgICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIDEwXjYpICU+JQ0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiMgICBsYWJzKHRpdGxlID0gIlJlbnRhIGdhc8OtZmVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vIHkgZXh0ZXJubyIsDQojICAgICAgICB5ID0gIk1NIGRlIHBlc29zIGRlIDIwMTgiKSsNCiMgICB4bGltKDE5NjAsIDIwMjEpDQojIGdyYWZfZGlmX2dhcw0KDQoNCg0KYGBgDQoNCiMgUmVudGEgYXByb3BpYWRhIHBvciBzb2JyZXZhbHVhY2nDs24gY2FtYmlhcmlhDQoNCg0KJCRSc29icmV2YWx1YWNpb24gPSBFeHBvICogUGV4dCAqIChUQ1AgLSBUQ0MpJCQgDQoNCkRvbmRlOg0KKiAkUnNvYnJldmFsdWFjaW9uJCA9IFJlbnRhIGFwcm9waWFkYSBwb3IgZXhwb3J0YWNpb25lcyBjb24gdGlwbyBkZSBjYW1iaW8gc29icmV2YWx1YWRvDQoqICRFeHBvJCA9IEV4cG9ydGFjaW9uZXMgIChiYXJyaWxlcyBkZSBwZXRyw7NsZW8gw7MgTU1CVFUpDQoqICRQZXh0JCA9IFByZWNpbyBkZSByZWZlcmVuY2lhIGRlbCBtZXJjYWRvIGV4dGVybm8gKFVTRCkNCiogJFRDUCQgPSBUaXBvIGRlIENhbWJpbyBkZSBQYXJpZGFkDQoqICRUQ0MkID0gVGlwbyBkZSBDYW1iaW8gQ29tZXJjaWFsDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCnJlbnRhX3RjcF9jcnVkbyA8LSAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lDQogIGxlZnRfam9pbihleHBvX3VzZF9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2NydWRvX3VzZCA9IGV4cG9fY3J1ZG8sIHVuaWRhZF9leHBvID0gdW5pZGFkICkpICU+JSANCiAgIG11dGF0ZShyZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyA9IGV4cG9fY3J1ZG8qcHJlY2lvX2V4dGVybm9fY3J1ZG8qdGNwIC0gZXhwb19jcnVkbypwcmVjaW9fZXh0ZXJub19jcnVkbyp0Y2MsDQogICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG9fdmFsb3IgPSBleHBvX2NydWRvX3VzZCogdGNwIC0gZXhwb19jcnVkb191c2QqIHRjYywgDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gIlVTRCIsIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIGRpZiA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvL3JlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvX3ZhbG9yLTEpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50aWRhZCAsIGV4cG9fY3J1ZG8sDQogICAgICAgICB1bmlkYWRfZXhwbywgZXhwb19jcnVkb191c2QsDQogICAgICAgICB1bmlkYWRfcHJlY2lvLCBwcmVjaW9fZXh0ZXJub19jcnVkbyAsDQogICAgICAgICAgdGNjLCB0Y3AsIHVuaWRhZF9yZW50YSwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkb192YWxvciwgZGlmKSAgDQpyZW50YV90Y3BfY3J1ZG8NCg0KcmVudGFfdGNwX2dhcyA8LSAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgJT4lIA0KICAgbXV0YXRlKHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyA9IGV4cG9fZ2FzKnByZWNpb19leHRlcm5vX2dhcyp0Y3AgLSBleHBvX2dhcypwcmVjaW9fZXh0ZXJub19nYXMqdGNjLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJVU0QiLCB1bmlkYWRfcmVudGEgPSAiUGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50aWRhZCAsIGV4cG9fZ2FzLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19leHRlcm5vX2dhcyAsDQogICAgICAgICAgdGNjLCB0Y3AsIHVuaWRhZF9yZW50YSwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcykgIA0KDQoNCg0KYGBgDQoNCg0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3IgZWwgRXN0YWRvIG1lZGlhbnRlIGltcHVlc3RvcyBlc3BlY8OtZmljb3MNCg0KYGBge3IgZWNobz1GQUxTRX0NCg0KcmV0ZW5jaW9uZXNfY2FtcG9kb25pY28gPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9hZmlwL3JldGVuY2lvbmVzLnhsc3giICwgDQogICAgc2hlZXQgPSAidXNkIikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbmVzX2hjID0gcmV0ZW5jaW9uZXNfaGcgKiBUQ0MgKiAxMDAwMDAwLA0KICAgICAgICAgdW5pZGFkID0gImFycyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcmV0ZW5jaW9uZXNfaGMpDQoNCnJldGVuY2lvbmVzX2NydWRvIDwtIHJlYWRfZXhjZWwoICIuLi9kYXRhL2FmaXAvcmV0ZW5jaW9uZXMueGxzeCIgKSAlPiUNCiAgcmVuYW1lKHJldGVuY2lvbmVzX2NydWRvX2prID0gcmV0ZW5jaW9uZXNfamssDQogICAgICAgICByZXRlbmNpb25lc19jcnVkb19iZnIgPSAicmV0ZW5jaW9uZXNfYmZyX00kMjAwOCIpICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbmVzX2NydWRvX2JmciA9IHJldGVuY2lvbmVzX2NydWRvX2JmciAqIGlwYzA4X2JmciAqIDEwMDAgLA0KICAgICAgICAgdW5pZGFkID0gImFycyIpICU+JSANCiAgc2VsZWN0KC1pcGMwOF9iZnIpICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NhbXBvZG9uaWNvKQ0KDQoNCnJldGVuY2lvbmVzX3JlZ2FsaWFzIDwtIHJlZ2FsaWFzICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NydWRvICU+JSBzZWxlY3QoLWMocmV0ZW5jaW9uZXNfY3J1ZG9fYmZyLCByZXRlbmNpb25lc19oYykpKSANCg0KDQoNCnJldGVuY2lvbmVzX2NydWRvDQoNCg0KYGBgDQoNCg0KDQoNCiQkUmltcCA9IFJFICsgUmVnJCQNCg0KRG9uZGU6DQoNCiogJFJpbXAkID0gUmVudGEgYXByb3BpYWRhIHBvciBlbCBFc3RhZG8gbWVkaWFudGUgaW1wdWVzdG9zIGVzcGVjw61maWNvcw0KKiAkUkUkID0gUmV0ZW5jaW9uZXMNCiogJFJlZyQgPSBSZWdhbGlhcw0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3IgY29uc3VtaWRvcmVzIHkgcmVmaW5lcsOtYXMgeSBwcm9jZXNhZG9yYXMNCg0KIyMjIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIFJhbcOzbiAoMjAxOSkNCg0KIyMjIyBSZWZpbmVyw61hcyB5IHByb2Nlc2Fkb3Jhcw0KDQokJFJSID0gKFBJIC0gUFJNaSkgKiBDcnVkb1AkJA0KDQoNCg0KKiAkUlIkID0gUmVudGEgYXByb3BpYWRhIHBvciBsYXMgUmVmaW5hZG9yYXMgDQoqICRQSSQgPSBwcm9tZWRpbyBwb25kZXJhZG8gZGUgUHJlY2lvcyBJbnRlcm5hY2lvbmFsZXMgDQoqICRQUk1pJCA9IFByZWNpbyBwb25kZXJhZG8gYSBSZWZpbmVyw61hcyBkZWwgTWVyY2FkbyBJbnRlcm5vDQoqICRDcnVkb1AkID0gYmFycmlsZXMgZGUgQ3J1ZG8gUHJvY2VzYWRvIHBvciBsYXMgcmVmaW5hZG9yYXMNCg0KIyMjIyBDb25zdW1pZG9yZXMNCg0KJCRSQyA9IChQSSAtIFBSTWkgLSBNUikgKiBDcnVkb1AgJCQNCg0KKiAkUkMkID0gUmVudGEgYXByb3BpYWRhIHBvciBsb3MgQ29uc3VtaWRvcmVzDQoqICRNUiQgPSBNYXJnZW4gZGUgUmVmaW5lcsOtYXMNCg0KRXN0byByZXN1bHRhIGVxdWl2YWxlbnRlIGEgcGxhbnRlYXI6DQoNCiQkUkMgPSBQQ01pICogQ3J1ZG9QJCQNCg0KKiAkUENNaSQgPSBQcmVjaW8gcG9uZGVyYWRvIGEgQ29uc3VtaWRvcmVzIGRlbCBNZXJjYWRvIEludGVybm8uDQoNCg0KIyMgQ29tYnVzdGlibGVzDQpgYGB7cn0NCg0KYGBgDQoNCg0KDQoNCg0KIyBSZW50YSBIaWRyb2NhcmJ1csOtZmVyYSBUb3RhbC4gRW4gcHJlY2lvcyBjb25zdGFudGVzLCBzb2JyZSBQbHVzdmFsw61hIFRvdGFsIHkgUEJJDQoNCkV4aXN0ZW4gZG9zIGNhbWlub3MgcGFyYSBsbGVnYXIgYWwgbW9udG8gdG90YWwgZGUgcmVudGEgZGUgbGEgdGllcnJhIGhpZHJvY2FyYnVyw61mZXJhOiB1bm8gZXMgZGVzY29udGFuZG8gbGEgZ2FuYW5jaWEgbm9ybWFsIGRlIGxhcyBlbXByZXNhcyBhIGxhIHBsdXN2YWzDrWEgdG90YWwgZGVsIHNlY3RvciB5IGVsIG90cm8gZXMgcG9yIG1lZGlvIGRlIGxhIHN1bWEgZGUgbWVjYW5pc21vcyBkZSBhcHJvcGlhY2nDs24uDQoNCiQkUmVudGFcX2hpZHJvY2FyYnVyw61mZXJhID0gUFZfe2hpZHJvY2FyYnVyw61mZXJhfSAtIEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9JCQNCkRvbmRlOg0KDQoqICRHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBHYW5hbmNpYSBOb3JtYWwgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybw0KKiAkUFZfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBQbHVzdmFsw61hIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8gIA0KDQokJEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9ID0gS1RBX3toaWRyb2NhcmJ1csOtZmVyb30gKiBUR197cmVmZXJlbmNpYX0kJA0KDQoNCkRvbmRlOg0KDQoqICRLVEFfe2hpZHJvY2FyYnVyb3N9JCA9IFN0b2NrIGRlIGNhcGl0YWwgYWRlbGFudGFkbyBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvIA0KKiAkVEdfe3JlZmVyZW5jaWF9JCA9IFRhc2EgZGUgZ2FuYW5jaWEgbm9ybWFsIGRlIHJlZmVyZW5jaWEuDQoNCkVuIGVzdGUgY2Fzbywgc2VsZWNjaW9uYW1vcyBsYSB0YXNhIGRlIGdhbmFuY2lhIGRlbCBzZWN0b3IgaW5kdXN0cmlhbCBjb21vIHBhcsOhbWV0cm8gcGFyYSBkaWZlcmVuY2lhciBsYSByZW50YSBkZSBsYSBnYW5hbmNpYS4gQSBzdSB2ZXosIHBhcmEgZWwgY2FwaXRhbCB0b3RhbCBhZGVsYW50YWRvIGRlIGxhcyBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMsIHNlbGVjY2lvbmFtb3MgdW5pY2FtZW50ZSBlbCB2YWxvciByZXN1bHRhbnRlIGRlIGxhIGVzdGltYWNpw7NuIGRlIGxhIFBQeUUgZGUgQm9sc2FyIGEgcGFydGlyIGRlbCBpbmRpY2UgZGUgZmx1am8gZGUgcG96b3MgKHZhcmlhYmxlICJwcHllX2JvbHNhcl9mbHVqbyIpLCBwb3IgbG8gcXVlIGxlIGZhbHRhbiBsb3MgaW52ZW50YXJpb3MgeSBzYWxhcmlvcyBhZGVsYW50YWRvcy4NCg0KRWwgY8OhbGN1bG8gZGUgcmVudGEgdG90YWwgaGlkcm9jYXJidXLDrWZlcmEgcXVlIHNlIG9idGllbmUgcG9yIG1lZGlvIGRlIGRlc2NvbnRhciBsYSBnYW5hbmNpYSBub3JtYWwgYSBsYSBwbHVzdmFsw61hIHRvdGFsIGRlbCBzZWN0b3IsIGRlYmUgc2VyIGlndWFsIGEgbGEgcmVudGEgb2J0ZW5pZGEgcG9yIG1lZGlvIGRlIGxhIGFncmVnYWNpw7NuIGRlIGxvcyBkaXN0aW50b3MgbWVjYW5pc21vcyBkZSBhcHJvcGlhY2nDs24uIEVzIGRlY2lyOg0KDQokJFJlbnRhXF9oaWRyb2NhcmJ1csOtZmVyYSA9IFJlbnRhXF9kaWZlcmVuY2lhbFxfcHJlY2lvcyArIFJlbnRhXF9zb2JyZXZhbHVhY2nDs24gKyBSZW50YVxfZW1wcmVzYXMgKyBJbXB1ZXN0b3NcX25ldG9zXF9lc3BlY8OtZmljb3MgJCQNCiQkSW1wdWVzdG9zXF9uZXRvc1xfZXNwZWPDrWZpY29zID0gUmV0ZW5jaW9uZXMgKyBSZWdhbMOtYXMgLSBTdWJzaWRpb3MkJA0KDQojIyBNw6l0b2RvIGRpcmVjdG8gKGEgcGFydGlyIGRlIGRlc2N1ZW50b3Mgc29icmUgZWwgVkJQKQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyBrbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz0gVFJVRSxmaWcud2lkdGggPSAxMjAsZmlnLmhlaWdodCA9IDQwMCkNCnJlbnRhX2RpcmVjdG8gPC0gcmVudGFfdGcgJT4lIA0KICBzZWxlY3QoYW5pbywgcHB5ZSAsICNlcyBzdG9jayBkZSBib2xzYXINCiAgICAgICAgIHRnX2hpZHJvY2FyYnVyb3MsIHRnX25vcm1hbCA9IHVuaW9uX3RnKSAlPiUgDQogIGxlZnRfam9pbihjcml0ZXJpb19wcm9waW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHB2KSApJT4lIA0KICBsZWZ0X2pvaW4oc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MgJT4lIA0KICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSwgYnkgPSJhbmlvIikgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShzdWJzaWRpb3MgPSAoc3Vic2lkaW9zX2NlZmlwLzEwXjYpL2lwY18xOCwgDQogICAgICAgICAgICAgICMgbXV0YXRlKHN1YnNpZGlvcyA9IChzdWJzaWRpb3NfZWplcy8xMF42KS9pcGNfMTgsIA0KICAgICAgICAgICAgICAgICAgICAgc3Vic2lkaW9zID1yZXBsYWNlX25hKHN1YnNpZGlvcywgMCkgKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBzdWJzaWRpb3MpKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCBieSA9ImFuaW8iKSAlPiUgDQogIG11dGF0ZShyZW50YV9jb25fdGdfbm9ybWFsID0gKHBweWUvaXBjXzE4KSAqICh0Z19oaWRyb2NhcmJ1cm9zIC0gdGdfbm9ybWFsKSwNCiAgICAgICAgIGdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MgPSBwcHllICogdGdfbm9ybWFsLA0KICAgICAgICAgcHYgPSBwdi9pcGNfMTgsDQogICAgICAgICByZW50YV90b3RhbCA9IHB2IC0gZ2NpYV9ub3JtYWxfaGlkcm9jYXJidXJvcyAtc3Vic2lkaW9zLA0KICAgICAgICAgIyBwcm9wb3JjaW9uX3N1YnNpZGlvcyA9IHN1YnNpZGlvcy8NCiAgICAgICAgICMgICAocHYgLSBnY2lhX25vcm1hbF9oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikgJT4lIA0KICBzZWxlY3QoYW5pbyAsIGlwY18xOCwgdW5pZGFkLCBldmVyeXRoaW5nKC4pLCAtcmVudGFfY29uX3RnX25vcm1hbCkgJT4lICNzYWNvIHJlbnRhX2Nvbl90Z19ub3JtYWwgcG9yIG5vIHVzbw0KICBmaWx0ZXIoYW5pbyA+MTk5NykNCnJlbnRhX2RpcmVjdG8NCg0KIyByZW50YV9kaXJlY3RvICU+JQ0KIyAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUNCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHJlbnRhX3RvdGFsKSkrDQojICAgZ2VvbV9saW5lKCkrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCBhIHBhcnRpciBkZSBlc3RpbWFjacOzbiBwcm9waWEgZGVsIFZCUCIsDQojICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkNCg0KDQpyZW50YV9kaXJlY3RvX3BiaSA8LSByZW50YV9kaXJlY3RvICU+JQ0KICBsZWZ0X2pvaW4oZ2FuYW5jaWFfeV9wYmkgJT4lIHJlbmFtZSh1bmlkYWRfcGJpX2djaWEgPSB1bmlkYWQpLCAgYnkgPSAiYW5pbyIpICU+JQ0KICAjIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCAgYnkgPSAiYW5pbyIpICU+JQ0KICBtdXRhdGUocmVudGFfcHYgPShyZW50YV90b3RhbCppcGNfMTggKS9nYW5hbmNpYSwNCiAgICAgICAgIHJlbnRhX3BiaSA9KHJlbnRhX3RvdGFsKmlwY18xOCApL3BiaSApDQoNCg0KIyBncmFmX3JlbnRhX2RpcmVjdG9fcGJpIDwtIHJlbnRhX2RpcmVjdG9fcGJpICU+JQ0KIyAgIHNlbGVjdChhbmlvLCByZW50YV9wdixyZW50YV9wYmkgKSAlPiUNCiMgICAjIGZpbHRlcihhbmlvID49IDE5NjIsIGZ1ZW50ZV9nY2lhID09ICJQcm9waWEiKSAlPiUNCiMgICBmaWx0ZXIoYW5pbyA+PSAxOTYyKSAlPiUNCiMgICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMjozKSAlPiUNCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yKSkrDQojICAgIyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KIyAgIGdlb21fbGluZSgpKw0KIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCBzb2JyZSBQQkkgeSBHYW5hbmNpYXMgVG90YWxlcyIsDQojICAgICAgICBzdWJ0aXRsZSA9ICJBIHBhcnRpciBkZSBlc3RpbWFjacOzbiBwcm9waWEgZGVsIFZCUCIsDQojICAgICAgICB5ID0gIiUiKSsNCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAyKSkrDQojICAgZmFjZXRfZ3JpZCh+dGlwb19yZW50YSApDQoNCiMgZ3JhZl9yZW50YV9kaXJlY3RvX3BiaQ0KIyBnZ3Bsb3RseShncmFmX3JlbnRhX2RpcmVjdG9fcGJpLCBoZWlnaHQgPSA0MDAsIHdpZHRoID0gNjAwKQ0KDQoNCg0KYGBgDQoNCg0KIyMgTcOpdG9kbyBpbmRpcmVjdG8gKHN1bWEgZGUgbWVjYW5pc21vcykNCg0KYGBge3IgZWNobz1GQUxTRX0NCnJlbnRhX2luZGlyZWN0byA8LSByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAlPiUgDQogICMgc2VsZWN0KGFuaW8scmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50ICkgJT4lDQogIHNlbGVjdChhbmlvLHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICkgJT4lDQogIGxlZnRfam9pbihyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX2RpZl9wcmVjaW9zX2dhcykgKSAlPiUgDQogIGxlZnRfam9pbihyZXRlbmNpb25lc19yZWdhbGlhcyAlPiUgc2VsZWN0KGFuaW8sIHJldGVuY2lvbmVzID0gcmV0ZW5jaW9uZXNfY3J1ZG9famssIHJlZ2FsaWFzX3RvdGFsKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfdGNwX2NydWRvICU+JSBzZWxlY3QoYW5pbywgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8pKSAlPiUgDQogIGxlZnRfam9pbihyZW50YV90Y3BfZ2FzICU+JSBzZWxlY3QoYW5pbywgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzKSkgJT4lIA0KICAgbGVmdF9qb2luKHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHN1YnNpZGlvcyA9IHN1YnNpZGlvc19jZWZpcCksIGJ5ID0iYW5pbyIpICU+JQ0KICAgICAgICAgICAgICAjIHNlbGVjdChhbmlvLCAgc3Vic2lkaW9zID0gc3Vic2lkaW9zX2VqZXMpLCBieSA9ImFuaW8iKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbyApICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjZ9KSAlPiUgI2xhcyB2YmxlcyBjYXJnYWRhcyBhbnRlcmlvcm1lbnRlIHNlIHBhc2FuIGEgTU0NCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSByZXBsYWNlX25hKHgsIDApKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogICMgbGVmdF9qb2luKHJlbnRhX3RnICU+JSANCiAgIyAgICAgICAgICAgICBmaWx0ZXIoc3RvY2tfc2VsZWNjaW9uYWRvID09ICJCb2xzYXIiKSAlPiUgDQogICMgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfY29uX3RnX3VuaW9uKSApICU+JSAjIHNhY28gcmVudGEgZW1wcmVzYXMgDQogICMgbGVmdF9qb2luKHJlbnRhX2RpcmVjdG8gJT4lDQogICMgICAgICAgICAgICAgZmlsdGVyKHN0b2NrX3NlbGVjY2lvbmFkbyA9PSAicHB5ZV9ib2xzYXIiKSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmVudGFfZW1wcmVzYXMgPSByZW50YV9jb25fdGdfbm9ybWFsKSAlPiUgDQogICMgICAgICAgICAgICAgbXV0YXRlKHJlbnRhX2VtcHJlc2FzID0gMCkpICU+JQ0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IpICU+JSANCiAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpICU+JSByZW5hbWUodW5pZGFkX3BiaV9nY2lhID0gdW5pZGFkKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUoDQogICAgcmVudGFfZGlmX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzIC9pcGNfMTgsDQogICAgICAgICByZW50YV9kaWZfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvIC8gaXBjXzE4LA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gPSByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkby9pcGNfMTgsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgPSByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMvaXBjXzE4LA0KICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSByZWdhbGlhc190b3RhbCAvIGlwY18xOCwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gcmV0ZW5jaW9uZXMgLyBpcGNfMTgsIA0KICAgICAgICAgc3Vic2lkaW9zID0gc3Vic2lkaW9zL2lwY18xOCwNCiAgICAjIHJlbnRhX2VtcHJlc2FzID1yZXBsYWNlX25hKHJlbnRhX2VtcHJlc2FzLCAgMCksDQogICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMvaXBjXzE4LA0KICAgICAgICAgcmVudGFfdG90YWwgPSByZW50YV9kaWZfcHJlY2lvc19nYXMrIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICsNCiAgICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gKyByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgKw0KICAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzKw0KICAgICAgICAgICByZWdhbGlhc190b3RhbCArICByZXRlbmNpb25lcyAtIHN1YnNpZGlvcywNCiAgICAgICAgIHByb3BvcmNpb25fc3Vic2lkaW9zID0gc3Vic2lkaW9zLyhyZW50YV9kaWZfcHJlY2lvc19nYXMrIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICsNCiAgICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gKyByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgKw0KICAgICAgICAgICByZWdhbGlhc190b3RhbCArICByZXRlbmNpb25lcykgICwNCiAgICAgICAgIHJlbnRhX3B2ID0gKHJlbnRhX3RvdGFsKmlwY18xOCkvZ2FuYW5jaWEsDQogICAgICAgICByZW50YV9wYmkgPSAocmVudGFfdG90YWwqaXBjXzE4KS9wYmksDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIsDQogICAgICAgICByZW50YV91c2RfdGNjID0gKHJlbnRhX3RvdGFsKmlwY18xOCkgLyB0Y2MsIA0KICAgICAgICAgcmVudGFfdXNkX3RjcCA9IChyZW50YV90b3RhbCppcGNfMTgpIC8gdGNwLCkgICU+JSANCiAgcmVuYW1lKHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvLA0KICAgICAgICAgIyByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2JyZW50ID0gcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQsDQogICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbyA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICwNCiAgICAgICAgIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcyA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcywpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgaXBjXzE4LHRjYyx0Y3AsIGV2ZXJ5dGhpbmcoLikgLCAtc29icmV2YWx1YWNpb24pICU+JSANCiAgIyBzZWxlY3QoLXJlbnRhX2RpZl9wcmVjaW9zX2NydWRvKQ0KICAjIHNlbGVjdCgtcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQpICU+JSANCiAgZGlzdGluY3QoKQ0KDQojIA0KIyAjUmVudGEgdG90YWwNCiMgZ3JhZl9yZW50YV90b3RhbCA8LSByZW50YV9pbmRpcmVjdG8gJT4lDQojICAgZmlsdGVyKGFuaW8gPjE5NjApICU+JQ0KIyAgIG11dGF0ZShzdWJzaWRpb3MgPSBzdWJzaWRpb3MqLTEpICU+JQ0KIyAgIHNlbGVjdCgtYyh1bmlkYWQsIGlwY18xOCwgcmVudGFfdG90YWwsIHRjYywgdGNwLA0KIyAgICAgICAgICAgICAgcHJvcG9yY2lvbl9zdWJzaWRpb3MpKSAlPiUNCiMgICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMjo4KSAlPiUNCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmEiLA0KIyAgICAgICAgc3VidGl0bGUgPSAiQ3Vyc29zIGRlIGFwcm9waWFjacOzbi4gTWlsbG9uZXMgcGVzb3MgZGUgMjAxOCIsDQojICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSsNCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQojICAgdGhlbWVfY2xhc3NpYygpDQojIA0KIyAjIGdncGxvdGx5KGdyYWZfcmVudGFfdG90YWwsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQojIGdyYWZfcmVudGFfdG90YWwNCiMgDQojIA0KIyANCiMgIyMjIyMjIHByb3BvcmNpb24gc3Vic2lkaW9zDQojICMgcmVudGFfaW5kaXJlY3RvWyxjKCJhbmlvIiwicHJvcG9yY2lvbl9zdWJzaWRpb3MiKV0gJT4lIGFycmFuZ2UoLWFuaW8pDQojIHJlbnRhX2RpcmVjdG8gJT4lDQojICAgbXV0YXRlKHBlc29fc3Vic2lkaW9zID0gc3Vic2lkaW9zL3JlbnRhX3RvdGFsLA0KIyAgICAgICAgICBtZXRvZG8gPSAiRGlyZWN0byIpICU+JQ0KIyAgICAgICAgICBzZWxlY3QoYW5pbywgbWV0b2RvLCBwZXNvX3N1YnNpZGlvcywgcmVudGFfdG90YWwpICU+JQ0KIyAgIHJiaW5kKHJlbnRhX2luZGlyZWN0byAlPiUNCiMgICAgICAgICAgIG11dGF0ZShwZXNvX3N1YnNpZGlvcyA9IHN1YnNpZGlvcy9yZW50YV90b3RhbCwNCiMgICAgICAgICAgICAgICAgICBtZXRvZG8gPSAiSW5kaXJlY3RvIikgJT4lDQojICAgICAgICAgICBzZWxlY3QoYW5pbyxtZXRvZG8sICBwZXNvX3N1YnNpZGlvcywgcmVudGFfdG90YWwpKSAlPiUNCiMgICBmaWx0ZXIoYW5pbyA+IDIwMDQpICU+JQ0KIyAgIHJlc2hhcGUyOjptZWx0KGlkLnZhcnMgPSBjKCJhbmlvIiwgIm1ldG9kbyIpKSAlPiUNCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbHVlLCBjb2xvciA9IG1ldG9kbykpKw0KIyAgIGdlb21fbGluZSgpKw0KIyBmYWNldF93cmFwKH52YXJpYWJsZSxzY2FsZXM9ICJmcmVlIikNCg0KDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCiNSZW50YSB0Y3AgeSB0Y2MNCiMgZ3JhZl9yZW50YV90b3RhbF91c2QgPC0gcmVudGFfaW5kaXJlY3RvICU+JQ0KIyAgIHNlbGVjdChjKGFuaW8sIHJlbnRhX3VzZF90Y2MsIHJlbnRhX3VzZF90Y3ApKSAlPiUNCiMgICBmaWx0ZXIoYW5pbyA+IDE5NjIpICU+JQ0KIyAgIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KIyAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KIyAgICAgICAgICAyOjMpICU+JQ0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSkgKSsNCiMgICBnZW9tX2xpbmUoKSsNCiMgICBnZW9tX3BvaW50KCkrDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgKHBldHLDs2xlbyB5IGdhcykiLA0KIyAgICAgICAgc3VidGl0bGUgPSAiTWlsbG9uZXMgZGUgVVNEIiwNCiMgICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQojICAgdGhlbWVfY2xhc3NpYygpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KIyBnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX3VzZCwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCiMgZ2dzYXZlKCkNCg0KDQojY29tcGFyYWNpb24gY29uIEZSDQojIGdyYWZfY29tcGFyYWNpb25fcmVudGFzIDwtIHJlbnRhX2luZGlyZWN0byAlPiUNCiMgICBtdXRhdGUoZnVlbnRlID0gIlByb3BpYSB2aWEgc3VtYSBkZSBtZWNhbmlzbW9zIikgJT4lDQojICAgc2VsZWN0KGFuaW8sIHVuaWRhZCxmdWVudGUsICByZW50YV90b3RhbCApICU+JQ0KIyAgICMgYmluZF9yb3dzKHJlbnRhX2RpcmVjdG9fcGJpICU+JQ0KIyAgICMgICAgICAgICAgICAgICBtdXRhdGUoZnVlbnRlID0gIlByb3BpYSB2aWEgZGVzY3VlbnRvcyBzb2JyZSBWQlAiKSAlPiUNCiMgICAjICAgICAgICAgICAgICBzZWxlY3QoYW5pbyxmdWVudGUsICByZW50YV90b3RhbCApICkgJT4lDQojICAgYmluZF9yb3dzKHJlbnRhX2hpZHJvY2FyYnVyb3NfZnIgJT4lDQojICAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZSA9ICJGUiB5IEIiKSAlPiUNCiMgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBmdWVudGUsICByZW50YV90b3RhbCkpICU+JQ0KIyAgIGJpbmRfcm93cyhyZW50YV9oaWRyb2NhcmJ1cm9zX2prICU+JQ0KIyAgICAgICAgIHNlbGVjdChhbmlvLCByZW50YV90b3RhbCkgJT4lDQojICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KIyAgICAgICAgIG11dGF0ZShyZW50YV90b3RhbCA9IHJlbnRhX3RvdGFsLygxMF42KS9pcGNfMTgsDQojICAgICAgICAgICAgICAgIGZ1ZW50ZSA9ICJKSyIsDQojICAgICAgICAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikgKSAlPiUNCiMgICBiaW5kX3Jvd3MocmVudGFfZmQgJT4lDQojICAgICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiMgICAgICAgICAgICAgICBtdXRhdGUocmVudGFfdG90YWwgPSAocmVudGFfdG90YWwvMTAwMCkvaXBjXzE4LA0KIyAgICAgICAgICAgICAgICMgbXV0YXRlKHJlbnRhX3RvdGFsID0gKHB2X25ldGEvMTAwMCkvaXBjXzE4LA0KIyAgICAgICAgICAgICAgICAgICAgICBmdWVudGUgPSAiRkQiLA0KIyAgICAgICAgICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICkgJT4lDQojICAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQojICAgZ2dwbG90KGFlcyhhbmlvLCByZW50YV90b3RhbCwgY29sb3IgPSBmdWVudGUpKSsNCiMgICBnZW9tX2xpbmUoKSsNCiMgICAjIGdlb21fcG9pbnQoYWxwaGEgPSAwLjM1KSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsDQojICAgICAgICBzdWJ0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgZXN0aW1hY2lvbmVzLiBNaWxsb25lcyBwZXNvcyBkZSAyMDE4IiwNCiMgICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpKw0KIyAgIHRoZW1lX2NsYXNzaWMoKQ0KIyBncmFmX2NvbXBhcmFjaW9uX3JlbnRhcw0KDQoNCiN2IHBiaSB5IHB2DQojIGdyYWZfcmVudGFfdG90YWxfcHYgPC0gcmVudGFfaW5kaXJlY3RvICU+JQ0KIyAgIHNlbGVjdChhbmlvLCByZW50YV9wdixyZW50YV9wYmkgKSAlPiUNCiMgICBmaWx0ZXIoYW5pbyA+PSAxOTYyKSAlPiUNCiMgICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMjozKSAlPiUNCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCBzb2JyZSBQQkkgeSBHYW5hbmNpYXMgVG90YWxlcyIsDQojICAgICAgICBzdWJ0aXRsZSA9ICJTdW1hIGRlIG1lY2FuaXNtb3MiLA0KIyAgICAgICAgeSA9ICIlIikrDQojICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnQpDQojIGdncGxvdGx5KGdyYWZfcmVudGFfdG90YWxfcHYsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCg0KDQojc29sbyByZW50YSBlbXByZXNhcw0KIyByZW50YV9pbmRpcmVjdG8gJT4lDQojICAgZmlsdGVyKGFuaW8gPiAxOTYwKSAlPiUgDQojICAgbXV0YXRlKHJlbnRhX2VtcHJlc2FzX3B2ID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L2dhbmFuY2lhLA0KIyAgICAgICAgICByZW50YV9lbXByZXNhc19wYmkgPSByZW50YV9lbXByZXNhcyppcGNfMTgvcGJpKSAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHJlbnRhX2VtcHJlc2FzX3B2LCByZW50YV9lbXByZXNhc19wYmkpICU+JSANCiMgICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsIHZhbHVlID0gdmFsb3IsIDI6MyApICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBmaWxsID0gdmFyaWFibGUpKSsNCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiMgICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIGFwcm9waWFkYSBwb3IgZW1wcmVzYXMgc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KIyAgICAgICAgeSA9ICIlIikrDQojICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnQpDQoNCiAgDQpgYGANCg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIHNvbG8gZ2FzDQojIEdhcw0KIyByZW50YV9nYXNfcGJpX3B2IDwtIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzICU+JSANCiMgICBzZWxlY3QoYW5pbyxyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcywgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMgKSAlPiUgDQojICAgZ3JvdXBfYnkoYW5pbyApICU+JSANCiMgICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHt4IC8gMTBeNn0pICU+JSANCiMgICBsZWZ0X2pvaW4oZ2FuYW5jaWFfeV9wYmkpICU+JSANCiMgICBtdXRhdGUocmVudGFfZGlmX3ByZWNpb3NfZ2FzX3B2ID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzL2dhbmFuY2lhLA0KIyAgICAgICAgICByZW50YV9kaWZfcHJlY2lvc19nYXNfcGJpID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzL3BiaSwNCiMgICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXNfcHYgPSByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcy9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXNfcGJpID0gcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvcGJpLA0KIyAgICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgUGVzb3MgY29ycmllbnRlcyIpDQojIA0KIyBncmFmX3JlbnRhX2dhc19wdiA8LSByZW50YV9nYXNfcGJpX3B2ICU+JSANCiMgICBzZWxlY3QoYW5pbywgNzpuY29sKC4pICkgJT4lIA0KIyAgIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KIyAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KIyAgICAgICAgICAyOm5jb2woLikpICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBwZXRyb2xlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgaW50ZXJubyB5IGV4dGVybm8gc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KIyAgICAgICAgeSA9ICIlIikNCiMgcGxvdGx5OjpnZ3Bsb3RseShncmFmX3JlbnRhX2dhc19wdikNCmBgYA0KDQojIyBDb3N0b3MNCg0KJCRRXF90b3RhbCA9IFFfe3BldHLDs2xlb30gKyBRX3tnYXN9ICQkDQpEb25kZToNCiAgDQogICogJFFcX3RvdGFsJCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyBkZSBwZXRyw7NsZW8geSBnYXMgZW4gQmFycmlsZXMgRXF1aXZhbGVudGVzIGRlIFBldHLDs2xlbw0KICAqICRRX3twZXRyw7NsZW99JCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyBkZSBwZXRyw7NsZW8gY3J1ZG8gZW4gYmFycmlsZXMgZXF1aXZhbGVudGVzIGRlIHBldHLDs2xlbyAoQk9FKQ0KICAqICRRX3tnYXN9JCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyBkZSBnYXMgbmF0dXJhbCBlbiBiYXJyaWxlcyBlcXVpdmFsZW50ZXMgZGUgcGV0csOzbGVvIChCT0UpDQogIA0KDQokJCBDb3N0b3NcX3RvdGFsZXMgPSAgQ0kgKyBNUyArIENvbktmaWpvJCQNCg0KRG9uZGU6DQoNCiogJENvc3Rvc1xfdG90YWxlcyQgPSBDb3N0b3MgdG90YWxlcyBoaWRyb2NhcmJ1csOtZmVyb3MNCiogJENJJCA9IENvbnN1bW8gSW50ZXJtZWRpbywgZGlzdGludGFzIGVzdGltYWNpb25lcw0KKiAkTVMkID0gTWFzYSBTYWxhcmlhbCwgZGlzdGludGFzIGVzdGltYWNpb25lcw0KKiAkQ29uS2Zpam8kID0gQ29uc3VtbyBkZSBDYXBpdGFsIEZpam8NCg0KDQokJENvc3Rvc1xfdG90YWxlc1xfY29uXF9HY2lhID0gQ29zdG9zXF90b3RhbGVzICsgR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0gJCQNCkRvbmRlOg0KDQoqICRDb3N0b3NcX3RvdGFsZXNcX2NvblxfR2NpYSQgPSBDb3N0b3MgdG90YWxlcyBoaWRyb2NhcmJ1csOtZmVyb3MgY29uIGdhbmFuY2lhIG5vcm1hbCANCiogJEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9JCA9IEdhbmFuY2lhIG5vcm1hbCBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvDQoNCiQkIFByZWNpb1xfY29zdG8gPSBcZnJhY3tDb3N0b3NcX3RvdGFsZXN9e1FcX3RvdGFsfSAgICQkDQpEb25kZToNCiogJFByZWNpb1xfY29zdG8kID0gUHJlY2lvIGRlIGNvc3RvIGVuIEJPRQ0KDQpBIHBhcnRpciBkZSBlc3RvIHNlIHB1ZWRlIGNhbGN1bGFyIHVuIGNvc3RvIHJlY3VwZXJhYmxlIGRlbCBwZXRyw7NsZW8geSBkZWwgZ2FzDQoNCiQkQ29zdG9cX2NydWRvID0gUV97cGV0csOzbGVvfSAqIFByZWNpb1xfY29zdG8kJA0KJCRDb3N0b1xfZ2FzID0gUV97Z2FzfSAqIFByZWNpb1xfY29zdG8kJA0KDQoNCiQkUHJlY2lvXF9wcm9kdWNjaW9uID0gXGZyYWN7Q29zdG9zXF90b3RhbGVzXF9jb25cX0djaWF9e1FcX3RvdGFsfSQkDQoNCiQkUHJlY2lvXF92dGFcX3BvdGVuY2lhbCA9ICBcZnJhY3tRXF90b3RhbCpQZXh0X3twZXRyw7NsZW99IC0gQ29zdG9zXF90b3RhbGVzfXtRXF90b3RhbH0gJCQNCg0KDQpEb25kZToNCiogJFByZWNpb1xfcHJvZHVjY2lvbiQ9IFByZWNpbyBkZSBwcm9kdWNjaW9uDQoqICRQcmVjaW9fdnRhX3BvdGVuY2lhbCQgPSBQcmVjaW8gZGUgdmVudGEgcG90ZW5jaWFsDQoqICRQZXh0X3twZXRyw7NsZW99JCA9IFByZWNpbyBkZSBleHBvcnRhY2nDs24vcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIGRlbCBwZXRyw7NsZW8gY3J1ZG8NCg0KYGBge3J9DQojZXN0aW1hY2lvbiBjb3N0b3MgcHJvcGlhDQpjb3N0b3MgPC0gcHJvZHVjY2lvbl90b3RhbCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfcHJvZHVjY2lvbj11bmlkYWQsDQogICAgICAgICBwcm9kdWNjaW9uX2NydWRvID1wcm9kX2NydWRvLCBwcm9kdWNjaW9uX2dhcz1wcm9kX2dhcywNCiAgICAgICAgIHByb2R1Y2Npb25fdG90YWw9cHJvZHVjY2lvbl90b3RhbF9iZXApICU+JSANCiBsZWZ0X2pvaW4oc3RvY2tfZXN0aW1hZG8gJT4lDQogICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX2JvbHNhciIpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNvbnN1bW9fa19maWpvID0gdmFsb3IgKiBpcGNfMTggKiBjb25zdW1vX2tfZmlqb195cGYpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjb25zdW1vX2tfZmlqbykpICU+JQ0KICBsZWZ0X2pvaW4odmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUgDQogICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogICAgICAgICAgICAgIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KC1zb2JyZXZhbHVhY2lvbikpICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIodmFyaWFibGUgJWluJSBjKCJjaV9leHRyIiwgIm1zX2V4dHIiKSwNCiAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZSVpbiUgYygiQ0NOTiBvZmljaWFsIiwgIkVtcGFsbWUgQ0NOTiIpKSAlPiUgIyJDcml0ZXJpbyBDQ05OIg0KICAgICAgICAgICAgICBtdXRhdGUodmFsb3IgPSAodmFsb3IqMTBeNikqaXBjXzE4L3RjYywNCiAgICAgICAgICAgICAgICAgICAgIHVuaWRhZCA9IlVTRCB0Y2MiKSAlPiUgDQogICAgICAgICAgICAgIHNwcmVhZChrZXk9dmFyaWFibGUsIHZhbHVlPXZhbG9yKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfZGlyZWN0byAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAjc3RvY2tfc2VsZWNjaW9uYWRvLA0KICAgICAgICAgICAgICAgICAgICAgcHB5ZSwgdGdfbm9ybWFsLCByZW50YV90b3RhbCkgKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX3JlZmVyZW5jaWFfZXh0ZXJubyA9IHByZWNpb19tZV9jcnVkbykpICU+JSANCiAgbXV0YXRlKHBweWUgPSAocHB5ZSoxMF42KSppcGNfMTgvdGNjLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAocmVudGFfdG90YWwqMTBeNikqaXBjXzE4L3RjYywNCiAgICAgICAgIHVuaWRhZF9jb3N0b3M9ICJVU0QvYm9lIiwNCiAgICAgICAgIGNvc3Rvc190b3RhbGVzID0gKGNpX2V4dHIgK21zX2V4dHIgKyBjb25zdW1vX2tfZmlqbyksDQogICAgICAgICBjb3N0b3NfdG90YWxlc19zdW1fZ2NpYV9ub3JtYWwgPSBjb3N0b3NfdG90YWxlcyArIChwcHllICAqIHRnX25vcm1hbCksDQogICAgICAgICBwcmVjaW9fY29zdG8gPSBjb3N0b3NfdG90YWxlcy9wcm9kdWNjaW9uX3RvdGFsLA0KICAgICAgICAgcHJlY2lvX2Nvc3RvX21tYnR1ID0gY29udmVyc29yX2JlcE1NQlRVX3AocHJlY2lvX2Nvc3RvKSwNCiAgICAgICAgIHByZWNpb19wcm9kdWNjaW9uID1jb3N0b3NfdG90YWxlc19zdW1fZ2NpYV9ub3JtYWwvcHJvZHVjY2lvbl90b3RhbCwNCiAgICAgICAgIHByZWNpb192ZW50YV9wb3RlbmNpYWwgPSAocHJvZHVjY2lvbl90b3RhbCAqcHJlY2lvX3JlZmVyZW5jaWFfZXh0ZXJubyAtDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdG9zX3RvdGFsZXMpL3Byb2R1Y2Npb25fdG90YWwgKQ0KICAgICAgICAgIyBwcmVjaW9fdmVudGFfcG90ZW5jaWFsID0gKChwcHllICogdGdfbm9ybWFsKStyZW50YV90b3RhbCkvcHJvZHVjY2lvbl90b3RhbCkNCiMgKHByb2R1Y2Npb24geCBwcmVjaW8gaW50ZXJuYWNpb25hbCAtIGNvc3Rvc190b3RhbGVzKSAvIGJhcnJpbGVzIEJPRSA9IGdjaWEgKyByZW50YSBwb3IgYmFycmlsIA0KI2V4cHJlc2FyIGVuIHVzZCB0Y2MgeSB0Y3ANCmNvc3Rvcw0KDQojIGNvc3RvcyAlPiUgDQojICAgICAgICAgICAgZmlsdGVyKGFuaW8gPiAxOTk3KSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCBwcmVjaW9fY29zdG8sIGNvbG9yID0gZnVlbnRlKSkrIA0KIyAgIGdlb21fbGluZShhbHBoYSA9IDAuNSwgc2l6ZSA9IDEuNCkrDQojICAgICBsYWJzKHRpdGxlID0gIlByZWNpbyBkZSBjb3N0byIsDQojICAgICAgICAgIHN1YnRpdGxlPSAiRXN0aW1hY2lvbiBwcm9waWEgYSBwYXJ0aXIgZGUgQ0NOTiB5IHJlZXN0aW1hY2lvbiBkZSBWQlAgY29uIGNyaXRlcmlvIENDTk4iLCANCiMgICAgICAgICAgeSA9ICJVU0QvQk9FIiwgeCA9ICJBw7FvIikNCg0KDQpgYGANCg0KIyBDb21wYXJhY2nDs24gY29uIGVzdGltYWNpw7NuIGRlIG90cm9zIGF1dG9yZXMNCg0KYGBge3J9DQoNCiNyZW50YSB1c2QgdnMgYXV0b3Jlcw0KI2ZhbHRhIGFncmVnYXIgcmVudGFfaGlkcm9jYXJidXJvc19qaw0KcmVudGFfY29tcGFyYWNpb24gPC0gcmVudGFfaW5kaXJlY3RvICU+JSANCiAgc2VsZWN0KGFuaW8sdGNjLCB0Y3AsIGlwY18xOCwgcmV0ZW5jaW9uZXMsIHJlZ2FsaWFzX3RvdGFsLCBjb250YWlucygicmVudGEiKSkgJT4lIA0KICBzZWxlY3QoIC0oMTM6bmNvbCguKSkpICU+JSANCiAgZmlsdGVyKGFuaW8gPiAxOTYyKSAlPiUNCiAgbXV0YXRlKCByZXRlbmNpb25lcz0gcmV0ZW5jaW9uZXMqaXBjXzE4L3RjYywgICAgICAgDQogICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSByZWdhbGlhc190b3RhbCppcGNfMTgvdGNjLCANCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbyppcGNfMTgvdGNwLA0KICAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMqaXBjXzE4L3RjcCwNCiAgICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbyA9IHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvKmlwY18xOC90Y3AsICANCiAgICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMgPSByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMqaXBjXzE4L3RjcCAgLA0KICAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uID0gcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8rIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcywNCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zID0gDQogICAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcysgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbywNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3RjYywNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3RjYywNCiAgICAgICAgICByZW50YV90b3RhbCA9IChyZW50YV90b3RhbCppcGNfMTgpIC8gdGNwLA0KICAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgICAgYXV0b3IgPSAiUHJvcGlhIikgJT4lIA0KICByZW5hbWUocmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lcywNCiAgICAgICAgIHJlZ2FsaWFzID0gcmVnYWxpYXNfdG90YWwNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMsDQogICAgICAgICAjIHJlbnRhX3RvdGFsX2dhcyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzLA0KICAgICAgICAgIyByZW50YV90b3RhbF9jcnVkbyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgYXV0b3IsIGV2ZXJ5dGhpbmcoLiksIA0KICAgICAgICAgLWMoaXBjXzE4LCB0Y2MsIHRjcCwgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8sIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcywNCiAgICAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzLCByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19kZV9yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgICBiaW5kX3Jvd3MocmVudGFfYXV0b3JlcykNCiMjIyMjDQoNCg0KI2dyYWZpY28gY29tcGFyYWNpb24gY29uIG90cm9zIGF1dG9yZXMNCiMgZ3JhZl90aXBvc19yZW50YSA8LSByZW50YV9jb21wYXJhY2lvbiAlPiUNCiMgICBmaWx0ZXIoISh0aXBvX2RlX3JlbnRhJWluJSBjKCJyZW50YV90b3RhbCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvcyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVudGFfZXN0YWRvX3RvdGFsIikpKSAlPiUNCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGF1dG9yKSkrDQojICAgZ2VvbV9saW5lKCkrDQojICAgZ2VvbV9wb2ludChzaXplID0gMC41KSsNCiMgICBmYWNldF93cmFwKH50aXBvX2RlX3JlbnRhLCBzY2FsZXMgPSAiZnJlZV95IikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSIsDQojICAgICAgICBzdWJ0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgZXN0aW1hY2lvbmVzLiBNaWxsb25lcyBVU0QiLA0KIyAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiMgICB0aGVtZV9jbGFzc2ljKCkrDQojICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCiMgIyBnZ3Bsb3RseShncmFmX3RpcG9zX3JlbnRhLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KIyBncmFmX3RpcG9zX3JlbnRhDQojIA0KIyANCiMgZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbiA8LSByZW50YV9jb21wYXJhY2lvbiAlPiUNCiMgICAjIGZpbHRlcighKGF1dG9yID09ICJQcm9waWEiICYgdGlwb19kZV9yZW50YSA9PSAicmVudGFfdG90YWwiKSkgJT4lDQojICAgIyBtdXRhdGUodGlwb19kZV9yZW50YT0gY2FzZV93aGVuKHRpcG9fZGVfcmVudGEgPT0icmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvcyIgJg0KIyAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9yID09ICJQcm9waWEiIH4gInJlbnRhX3RvdGFsIiwNCiMgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHRpcG9fZGVfcmVudGEpKSAlPiUNCiMgICBmaWx0ZXIodGlwb19kZV9yZW50YSA9PSAicmVudGFfdG90YWwiLCBhbmlvID4gMTk5MCkgJT4lDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBhdXRvcikpKw0KIyAgIGdlb21fbGluZSgpKw0KIyAgIGdlb21fcG9pbnQoKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsDQojICAgICAgICBzdWJ0aXRsZSA9ICJDb24gcmVudGEgdG90YWwgcHJvcGlhIG1ldG9kb2xvZ8OtYSBhdXRvcmVzIiwNCiMgICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQojICAgdGhlbWVfY2xhc3NpYygpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KIyBncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uDQoNCiMgZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbiwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCiMgZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbl9iKQ0KDQpgYGANCg0KDQoNCiMgRXhwb3J0YWNpb24gZGUgcmVzdWx0YWRvcw0KDQpgYGB7cn0NCiNyYXcgZGF0YSBmb3IgbWV0YWRhdGENCmRhdG9zIDwtICBsaXN0KCBwcm9kX21lcmdlX2NydWRvLCBwcmVjaW9fbWlfY3J1ZG8sIGV4cG9fcV9jcnVkbywgcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywgcHJvZF9tZXJnZV9nYXNfTU1CVFUsIA0KICAgcHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCwgIGV4cG9fcV9nYXMsICBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUsIHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zLA0KICAgZ2FuYW5jaWFfeV9wYmksIHRjcF9hbnVhbF9iLCBpcGNfcHJvbWVkaW8gLCByZW50YV9pbmRpcmVjdG9bLGMoMToxMywgMTcpXSwgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG9bLC0xNF0sIA0KIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzWywtMTNdLCByZW50YV90Y3BfY3J1ZG9bLC1jKDEyOjEzKV0sIHJlbnRhX3RjcF9nYXMsIHJlZ2FsaWFzX3VzZCwgcmV0ZW5jaW9uZXNfY3J1ZG8sIHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zLCANCiByZW50YV9wcm9kdWNjaW9uX2JhbGFuY2VzICwgY3JpdGVyaW9fcHJvcGlvLCByZW50YV9kaXJlY3RvLCByZW50YV9kaXJlY3RvX3BiaVssYygxLDE0OjE1KV0sIA0KIHJlbnRhX2luZGlyZWN0b1ssYygxLDE5OjIwKV0sICBjY25uX29maWNpYWwsIGNyaXRlcmlvX2Njbm4sIGVtcGFsbWVfY2NubiwgY3JpdGVyaW9fcHJvcGlvLCANCnJlbnRhX2NvbXBhcmFjaW9uLCByZW50YV9lbXByZXNhc19iYWxhbmNlcywgIHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzLCB1bmlvbl9zZWdtZW50b3MsIGNvc3RvcykNCg0KIyMgdmFyaWFibGVzIGRlIHRvZG9zIGxvcyBkYXRhZnJhbWVzDQpjb2x1bW5hcyA8LSBjKCkNCmZvcihpIGluIDE6bGVuZ3RoKGRhdG9zKSl7DQogIGNvbHVtbmFzIDwtIGMoY29sdW1uYXMsIGNvbG5hbWVzKGRhdG9zW1tpXV0pKQ0KfQ0KDQpsaXN0X2NvbCA8LSAgYXMuZGF0YS5mcmFtZSh1bmlxdWUoY29sdW1uYXMpKQ0KDQoNCiMgeCA8LSByZWFkeGw6OnJlYWRfZXhjZWwoImNvbHVtbmFzLnhsc3giKSAlPiUgDQojICAgIyByZW5hbWUodmFyaWFibGUgPSAidW5pcXVlKGNvbHVtbmFzKSIpICU+JSANCiMgICBtdXRhdGUodW5pZGFkID0gY2FzZV93aGVuKHN0cl9kZXRlY3QodmFyaWFibGUsIHJlZ2V4KCJnYXN8Ym9saXZpYSIpKSAgJiBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgicHJlY2lvfHByaWNlIikpIH4gIlVTRC9NTUJUVSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgiZ2FzfGxuZyIpKSAgJiBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgicHJvZCIpKSB+ICJNTUJUVSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgiY3J1ZG98cGV0cm9sZW8iKSkgICYgc3RyX2RldGVjdCh2YXJpYWJsZSwgcmVnZXgoInByZWNpbyIpKSB+ICJVU0QvQmFycmlsIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QodmFyaWFibGUsIHJlZ2V4KCJjcnVkb3xwZXRyb2xlbyIpKSB+ICJCYXJyaWxlcyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgiY3J1ZG98cGV0cm9sZW8iKSkgICYgc3RyX2RldGVjdCh2YXJpYWJsZSwgcmVnZXgoInByb2R8ZXhwbyIpKSB+ICJCYXJyaWxlcyIpKQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeCh4LCBwYXRoID0gICJjb2x1bW5hcy54bHN4IikNCg0KdDEgPC0gU3lzLnRpbWUoKQ0KZGVsdGEgIDwtIGFzLm51bWVyaWMoICB0MSAtIHQwLCB1bml0cyA9ICJzZWNzIikgICNjYWxjdWxvIGxhIGRpZmVyZW5jaWEgZGUgdGllbXBvcw0KcHJpbnQoIGRlbHRhKSANCmBgYA0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGRhdGEudGFibGUpDQoNCiMjIEV4cG9ydGFjacOzbiBkZSByZXN1bHRhZG9zDQoNCiNWYXJpYWJsZXMNCiNnYW5hbmNpYSB5IHBiaQ0KZ2FuYW5jaWFfeV9wYmkgPSBhcy5kYXRhLnRhYmxlKGdhbmFuY2lhX3lfcGJpKQ0Kc2V0bmFtZXMoZ2FuYW5jaWFfeV9wYmksIG9sZCA9IGMoImdhbmFuY2lhIiwgInBiaSIpLCBuZXcgPSBjKCJHIiwgIlBJQl9jb3JyIikpDQpnYW5hbmNpYV95X3BiaSA9IG5hLm9taXQoZ2FuYW5jaWFfeV9wYmkpDQojIGdhbmFuY2lhX3lfcGJpID0gbWVsdChnYW5hbmNpYV95X3BiaSwgaWQudmFycyA9IGMoImFuaW8iLCAidW5pZGFkIiksIA0KIyAgICAgIHZhcmlhYmxlLm5hbWUgPSAiY29kaWdvX3ZhcmlhYmxlIiwgdmFsdWUubmFtZSA9ICJ2YWxvciIgKQ0KIyBnYW5hbmNpYV95X3BiaVssIHZhcmlhYmxlIDo9IGZjYXNlKGNvZGlnb192YXJpYWJsZSA9PSAiRyIsICJHYW5hbmNpYSB0b3RhbCBkZSBsYSBlY29ub23DrWEiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnb192YXJpYWJsZSA9PSAiUElCX2NvcnIiLCAiUHJvZHVjdG8gSW50ZXJubyBCcnV0bywgcHJlY2lvcyBjb3JyaWVudGVzIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gIE5BKV0NCmdhbmFuY2lhX3lfcGJpWywgZnVlbnRlIDo9ICJWZXIgYW5leG8iXQ0KDQoNCiNUQ1ANCnRjcF9hbnVhbF9iID0gYXMuZGF0YS50YWJsZSh0Y3BfYW51YWxfYikNCnNldG5hbWVzKHRjcF9hbnVhbF9iLCBvbGQgPSBjKCJ0Y2MiLCAidGNwIiwgInNvYnJldmFsdWFjaW9uIiksIG5ldyA9IGMoIlRDYyIsICJUQ3AiLCAic3YiKSkNCiMgdGNwX2FudWFsX2IgPSBtZWx0KHRjcF9hbnVhbF9iLCBpZC52YXJzID0gYygiYW5pbyIpLCANCiMgICAgICB2YXJpYWJsZS5uYW1lID0gImNvZGlnb192YXJpYWJsZSIsIHZhbHVlLm5hbWUgPSAidmFsb3IiICkNCiMgdGNwX2FudWFsX2JbLCB2YXJpYWJsZSA6PSBmY2FzZShjb2RpZ29fdmFyaWFibGUgPT0gIlRDYyIsICJUaXBvIGRlIGNhbWJpbyBjb21lcmNpYWwiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnb192YXJpYWJsZSA9PSAiVENwIiwgIlRpcG8gZGUgY2FtYmlvIGRlIHBhcmlkYWQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnb192YXJpYWJsZSA9PSAic3YiLCAiU29icmV2YWx1YWNpw7NuIGNhbWJpYXJpYSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gIE5BKV0NCnRjcF9hbnVhbF9iWywgZnVlbnRlIDo9ICJWZXIgYW5leG8iXQ0KDQoNCiNJUEMNCmlwY19wcm9tZWRpbyA9IGFzLmRhdGEudGFibGUoaXBjX3Byb21lZGlvKQ0Kc2V0bmFtZXMoaXBjX3Byb21lZGlvLCBvbGQgPSBjKCJpcGNfMDMiLCAiaXBjXzcwIiwgImlwY18xOCIpLCBuZXcgPSBjKCJJUENfMDMiLCAiSVBDXzcwIiwgIklQQ18xOCIpKQ0KaXBjX3Byb21lZGlvWywgZmVjaGEgOj0gTlVMTF0NCg0KIyBwcm9kdWNjaW9uIGNydWRvDQpwcm9kX21lcmdlX2NydWRvID0gYXMuZGF0YS50YWJsZShwcm9kX21lcmdlX2NydWRvKQ0KcHJvZF9tZXJnZV9jcnVkb1ssIHByb2RfY3J1ZG8gOj0gTlVMTF0NCnNldG5hbWVzKHByb2RfbWVyZ2VfY3J1ZG8sIA0KICAgICAgICAgb2xkID0gYygicmVnYWxpYXMiLCAibWVjb24iICwgInNlc2NvIiwgImFudWFyaW9fY29tYnVzdGlibGVzIiwgImNydWRvX3NlY19lbmVyZ2lhIiwgImVpYSIgKSwNCiAgICAgICAgIG5ldyA9IGMoIlFfY3J1ZG9fcmVnYWxpYXMiLCAiUV9jcnVkb19tZWNvbiIgLCAiUV9jcnVkb19zZXNjbyIsICJRX2NydWRvX2FudWFyaW8iLCAiUV9jcnVkb19zZWNfZW5lcmdpYSIsICJRX2NydWRvX2VpYSIgKSAgKQ0KcHJvZF9tZXJnZV9jcnVkb1ssIHZhcmlhYmxlIDo9ICJQcm9kdWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8iXQ0KcHJvZF9tZXJnZV9jcnVkbyA9IG1lbHQocHJvZF9tZXJnZV9jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gYygiYW5pbyIsICJ2YXJpYWJsZSIsICJ1bmlkYWQiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gImNvZGlnb192YXJpYWJsZSIsIHZhbHVlLm5hbWUgPSAidmFsb3IiKQ0KcHJvZF9tZXJnZV9jcnVkbyA9IHByb2RfbWVyZ2VfY3J1ZG9bKGNvbXBsZXRlLmNhc2VzKHByb2RfbWVyZ2VfY3J1ZG9bLHZhbG9yXSkpICYgKHZhbG9yID4wKSBdDQpwcm9kX21lcmdlX2NydWRvWywgZnVlbnRlIDo9IGZjYXNlKGNvZGlnb192YXJpYWJsZSA9PSAiUV9jcnVkb19yZWdhbGlhcyIsICJTZWMuIEVuZXJnw61hIC0gUmVnYWzDrWFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaWdvX3ZhcmlhYmxlID09ICJRX2NydWRvX21lY29uIiAsICJNRUNPTiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnb192YXJpYWJsZSA9PSAiUV9jcnVkb19zZXNjbyIgLCAiU2VjLiBFbmVyZ8OtYSAtIFNFU0NPIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaWdvX3ZhcmlhYmxlID09ICJRX2NydWRvX2FudWFyaW8iICwgIkFudWFyaW8gZGUgY29tYnVzdGlibGVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaWdvX3ZhcmlhYmxlID09ICJRX2NydWRvX3NlY19lbmVyZ2lhIiAsICJTZWMuIEVuZXJnw61hIC0gU0VTQ08gKHNlcmllIGhpc3TDs3JpY2EpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaWdvX3ZhcmlhYmxlID09ICJRX2NydWRvX2VpYSIgLCAiRUlBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA9IE5BICApXQ0KDQojIHByb2R1Y2Npb24gZ2FzDQpwcm9kX21lcmdlX2dhc19NTUJUVSA9IGFzLmRhdGEudGFibGUocHJvZF9tZXJnZV9nYXNfTU1CVFUpDQpwcm9kX21lcmdlX2dhc19NTUJUVVssIHByb2RfZ2FzIDo9IE5VTExdDQpzZXRuYW1lcyhwcm9kX21lcmdlX2dhc19NTUJUVSwgDQogICAgICAgICBvbGQgPSBjKCJyZWdhbGlhcyIsICJtZWNvbiIgLCAic2VzY28iLCAiYW51YXJpb19jb21idXN0aWJsZXMiLCAic2VjX2VuZXJnaWFfcHJvZCIsICJlaWEiICksDQogICAgICAgICBuZXcgPSBjKCJRX2dhc19yZWdhbGlhcyIsICJRX2dhc19tZWNvbiIgLCAiUV9nYXNfc2VzY28iLCAiUV9nYXNfYW51YXJpbyIsICJRX2dhc19zZWNfZW5lcmdpYSIsICJRX2dhc19laWEiKSAgKQ0KcHJvZF9tZXJnZV9nYXNfTU1CVFVbLCB2YXJpYWJsZSA6PSAiUHJvZHVjY2nDs24gZGUgZ2FzIl0NCnByb2RfbWVyZ2VfZ2FzX01NQlRVID0gbWVsdChwcm9kX21lcmdlX2dhc19NTUJUVSwgDQogICAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gYygiYW5pbyIsICJ2YXJpYWJsZSIsICJ1bmlkYWQiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gImNvZGlnb192YXJpYWJsZSIsIHZhbHVlLm5hbWUgPSAidmFsb3IiKQ0KcHJvZF9tZXJnZV9nYXNfTU1CVFUgPSBwcm9kX21lcmdlX2dhc19NTUJUVVshaXMubmEodmFsb3IpXQ0KcHJvZF9tZXJnZV9nYXNfTU1CVFVbLCBmdWVudGUgOj0gZmNhc2UoY29kaWdvX3ZhcmlhYmxlID09ICJRX2dhc19yZWdhbGlhcyIsICJTZWMuIEVuZXJnw61hIC0gUmVnYWzDrWFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaWdvX3ZhcmlhYmxlID09ICJRX2dhc19tZWNvbiIgLCAiTUVDT04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ29fdmFyaWFibGUgPT0gIlFfZ2FzX3Nlc2NvIiAsICJTZWMuIEVuZXJnw61hIC0gU0VTQ08iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ29fdmFyaWFibGUgPT0gIlFfZ2FzX2FudWFyaW8iICwgIkFudWFyaW8gZGUgY29tYnVzdGlibGVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaWdvX3ZhcmlhYmxlID09ICJRX2dhc19zZWNfZW5lcmdpYSIgLCAiU2VjLiBFbmVyZ8OtYSAtIFNFU0NPIChzZXJpZSBoaXN0w7NyaWNhKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnb192YXJpYWJsZSA9PSAiUV9nYXNfZWlhIiAsICJFSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gTkEgICldDQoNCiMgZXhwbyBxIGNydWRvDQpleHBvX3FfY3J1ZG8gPSBhcy5kYXRhLnRhYmxlKGV4cG9fcV9jcnVkbykNCmV4cG9fcV9jcnVkb1ssIGA6PWAgICgiLi4uMSIgPSBOVUxMLCAiZXhwb19jcnVkbyIgPSBOVUxMKSBdDQpleHBvX3FfY3J1ZG9bLCB2YXJpYWJsZSA6PSAiRXhwb3J0YWNpb25lcyBkZSBwZXRyw7NsZW8gY3J1ZG8iXQ0Kc2V0bmFtZXMoZXhwb19xX2NydWRvLCANCiAgICAgICAgIG9sZCA9IGMoImV4cG9fc2VzY29fY3J1ZG8iLCAiZXhwb19tZWNvbl9jcnVkbyIsICJleHBvX2luZGVjX2NydWRvIiwiZXhwb19jb210cmFkZV9jcnVkbyIgKSwNCiAgICAgICAgIG5ldyA9IGMoICJTZWMuIEVuZXJnw61hIC0gU0VTQ08iLCAiTUVDT04iLCAiSU5ERUMiLCAiVU4tQ29tdHJhZGUiICkpDQpleHBvX3FfY3J1ZG8gPSBtZWx0KGV4cG9fcV9jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gYygiYW5pbyIsICJ2YXJpYWJsZSIsICJ1bmlkYWQiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gImZ1ZW50ZSIsIHZhbHVlLm5hbWUgPSAidmFsb3IiKQ0KZXhwb19xX2NydWRvID0gZXhwb19xX2NydWRvWyFpcy5uYSh2YWxvcildDQpleHBvX3FfY3J1ZG9bLCBjb2RpZ29fdmFyaWFibGUgOj0gZmNhc2UoIGZ1ZW50ZT09ICAiU2VjLiBFbmVyZ8OtYSAtIFNFU0NPIiAsICJYX2NydWRvX3Nlc2NvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlPT0gIk1FQ09OIiwgIlhfY3J1ZG9fbWVjb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlPT0gIklOREVDIiwgIlhfY3J1ZG9faW5kZWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlPT0gICAiVU4tQ29tdHJhZGUiLCAiWF9jcnVkb19jb210cmFkZSIgKSBdDQoNCg0KIyBleHBvIHEgZ2FzDQpleHBvX3FfZ2FzX01NQlRVID0gYXMuZGF0YS50YWJsZShleHBvX3FfZ2FzX01NQlRVKQ0KZXhwb19xX2dhc19NTUJUVVssIGA6PWAgICgiLi4uMSIgPSBOVUxMLCAiZXhwb19nYXMiID0gTlVMTCkgXQ0KZXhwb19xX2dhc19NTUJUVVssIHZhcmlhYmxlIDo9ICJFeHBvcnRhY2lvbmVzIGRlIGdhcyBuYXR1cmFsIl0NCnNldG5hbWVzKGV4cG9fcV9nYXNfTU1CVFUsIA0KICAgICAgICAgb2xkID0gYygiZXhwb19zZXNjb19nYXMiLCAiZXhwb19nYXNfbWVjb24iLCAiZXhwb19pbmRlY19nYXMiLCJleHBvX2dhc19jb210cmFkZSIgKSwNCiAgICAgICAgIG5ldyA9IGMoICJTZWMuIEVuZXJnw61hIC0gU0VTQ08iLCAiTUVDT04iLCAiSU5ERUMiLCAiVU4tQ29tdHJhZGUiICkpDQpleHBvX3FfZ2FzX01NQlRVID0gbWVsdChleHBvX3FfZ2FzX01NQlRVLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGlkLnZhcnMgPSBjKCJhbmlvIiwgInZhcmlhYmxlIiwgInVuaWRhZCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiZnVlbnRlIiwgdmFsdWUubmFtZSA9ICJ2YWxvciIpDQpleHBvX3FfZ2FzX01NQlRVID0gZXhwb19xX2dhc19NTUJUVVshaXMubmEodmFsb3IpXQ0KZXhwb19xX2dhc19NTUJUVVssIGNvZGlnb192YXJpYWJsZSA6PSBmY2FzZSggZnVlbnRlPT0gICJTZWMuIEVuZXJnw61hIC0gU0VTQ08iICwgIlhfZ2FzX3Nlc2NvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlPT0gIk1FQ09OIiwgIlhfZ2FzX21lY29uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZT09ICJJTkRFQyIsICJYX2dhc19pbmRlYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWVudGU9PSAgICJVTi1Db210cmFkZSIsICJYX2dhc19jb210cmFkZSIgKSBdDQoNCg0KIyBQcmVjaW8gY3J1ZG8gTWRvIGludGVybm8NCnByZWNpb19taV9jcnVkbyA9IGFzLmRhdGEudGFibGUocHJlY2lvX21pX2NydWRvKQ0KcHJlY2lvX21pX2NydWRvWywgdmFyaWFibGUgOj0gIlByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8iXQ0KcHJlY2lvX21pX2NydWRvWywgcHJlY2lvX2NydWRvX21kb2ludCA6PSBOVUxMXQ0Kc2V0bmFtZXMocHJlY2lvX21pX2NydWRvLA0KICAgICAgICAgb2xkID0gYygicmVnYWxpYXMiLCAibWVjb24iICwgIm1lY29uX2Njbm4iLCAieXBmIiwgImlkZWUiICksDQogICAgICAgICBuZXcgPSBjKCJTZWMuIEVuZXJnw61hIC0gUmVnYWzDrWFzIiwgIk1FQ09OIiwgIk1FQ09OL0NDTk4iLCAiWVBGIiwgIklERUUiICApKQ0KcHJlY2lvX21pX2NydWRvID0gbWVsdChwcmVjaW9fbWlfY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgaWQudmFycyA9IGMoImFuaW8iLCAidmFyaWFibGUiLCAidW5pZGFkIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJmdWVudGUiLCB2YWx1ZS5uYW1lID0gInZhbG9yIikNCnByZWNpb19taV9jcnVkbyA9IHByZWNpb19taV9jcnVkb1soIWlzLm5hKHZhbG9yKSkgJiAodmFsb3IgPiAwKSBdDQpwcmVjaW9fbWlfY3J1ZG9bLCAgY29kaWdvX3ZhcmlhYmxlIDo9IGZjYXNlKGZ1ZW50ZSA9PSAiU2VjLiBFbmVyZ8OtYSAtIFJlZ2Fsw61hcyIsICJQaV9jcnVkb19yZWdhbGlhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZSA9PSAiTUVDT04iLCAgIlBpX2NydWRvX21lY29uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID09ICJNRUNPTi9DQ05OIiwgIlBpX2NydWRvX21lY29uX2Njbm4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWVudGUgPT0iWVBGIiwgIlBpX2NydWRvX3lwZiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWVudGUgPT0gIklERUUiLCJQaV9jcnVkb19pZGVlIiApXQ0KDQojIFByZWNpbyBnYXMgTWRvIGludGVybm8NCnByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QgPSBhcy5kYXRhLnRhYmxlKHByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QpDQpwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkWywgdmFyaWFibGUgOj0gIlByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbCJdDQpwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkWywgcHJlY2lvX2dhc19tZG9pbnQgOj0gTlVMTF0NCnNldG5hbWVzKHByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QsDQogICAgICAgICBvbGQgPSBjKCJhbnVhcmlvIiwgInJlZ2FsaWFzIiwgIm1lY29uIiAsICJtZWNvbl9jY25uIiwgInlwZiIsICJpZGVlIiApLA0KICAgICAgICAgbmV3ID0gYygiQW51YXJpbyBkZSBjb21idXN0aWJsZXMiLCAiU2VjLiBFbmVyZ8OtYSAtIFJlZ2Fsw61hcyIsICJNRUNPTiIsICJNRUNPTi9DQ05OIiwgIllQRiIsICJJREVFIiAgKSkNCnByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QgPSBtZWx0KHByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgaWQudmFycyA9IGMoImFuaW8iLCAidmFyaWFibGUiLCAidW5pZGFkIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJmdWVudGUiLCB2YWx1ZS5uYW1lID0gInZhbG9yIikNCnByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QgPSBwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkWyFpcy5uYSh2YWxvcildDQpwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkWywgIGNvZGlnb192YXJpYWJsZSA6PSBmY2FzZShmdWVudGUgPT0gIlNlYy4gRW5lcmfDrWEgLSBSZWdhbMOtYXMiLCAiUGlfZ2FzX3JlZ2FsaWFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID09ICJBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcyIsICAiUGlfZ2FzX2FudWFyaW8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWVudGUgPT0gIk1FQ09OIiwgICJQaV9nYXNfbWVjb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWVudGUgPT0gIk1FQ09OL0NDTk4iLCAiUGlfZ2FzX21lY29uX2Njbm4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWVudGUgPT0iWVBGIiwgIlBpX2dhc195cGYiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID09ICJJREVFIiwiUGlfZ2FzX2lkZWUiICldDQoNCiMgcHJlY2lvIHJlZmVyZW5jaWEgeSBleHBvcnRhY2lvbiBkZSBjcnVkbw0KcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyA9IGFzLmRhdGEudGFibGUocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbykNCg0KI3ByZWNpbyByZWZlcmVuY2lhIGNydWRvDQpwcmVjaW9zX3JlZmVyZW5jaWFfY3J1ZG8gPSAgcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkb1ssLihhbmlvLCB1bmlkYWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlbnRfaGlzdG9yaWMsIGJyZW50X2llYSAsIHd0aV9laWEsIHd0aV9zcG90X3ByaWNlX2ZyZWQpXQ0KcHJlY2lvc19yZWZlcmVuY2lhX2NydWRvWywgdmFyaWFibGUgOj0gIlByZWNpb3MgZGUgcmVmZXJlbmNpYSBtdW5kaWFsIGRlIGNydWRvIl0NCnNldG5hbWVzKHByZWNpb3NfcmVmZXJlbmNpYV9jcnVkbywgDQogICAgICAgICBjKCJicmVudF9oaXN0b3JpYyIsICJicmVudF9pZWEiICwgInd0aV9laWEiLCAid3RpX3Nwb3RfcHJpY2VfZnJlZCIpLA0KICAgICAgICAgYygiQnJlbnQgKEluZmxhdGlvbiBEYXRhKSIsICJCcmVudCAoRUlBKSIsICJXVEkgKEVJQSkiLCAiV0lUIChGUkVEKSIpKQ0KcHJlY2lvc19yZWZlcmVuY2lhX2NydWRvID0gbWVsdChwcmVjaW9zX3JlZmVyZW5jaWFfY3J1ZG8sDQogICAgIGlkLnZhcnMgPSBjKCJhbmlvIiwgInZhcmlhYmxlIiwgInVuaWRhZCIpLCANCiAgICAgdmFyaWFibGUubmFtZSA9ICJmdWVudGUiLCB2YWx1ZS5uYW1lID0gInZhbG9yIikNCnByZWNpb3NfcmVmZXJlbmNpYV9jcnVkbyA9IHByZWNpb3NfcmVmZXJlbmNpYV9jcnVkb1shaXMubmEodmFsb3IpLF0NCnByZWNpb3NfcmVmZXJlbmNpYV9jcnVkb1ssIGNvZGlnb192YXJpYWJsZSA6PSBmY2FzZShmdWVudGUgPT0gIkJyZW50IChJbmZsYXRpb24gRGF0YSkiLCAiUGV4dF9icmVudCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZSA9PSJCcmVudCAoRUlBKSIsICJQZXh0X2JyZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID09ICJXVEkgKEVJQSkiLCAiUGV4dF93dGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWVudGUgPT0gIldJVCAoRlJFRCkiLCAiUGV4dF93dGkiICldIA0KDQoNCiNwcmVjaW8gZXhwb3J0YWNpb24gY3J1ZG8NCnByZWNpb3NfZXhwb3J0YWNpb25fY3J1ZG8gPSAgcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkb1ssLihhbmlvLCB1bmlkYWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9fcmVnYWxpYXNfY3J1ZG8sIHByZWNpb19leHBvX21lY29uX2NydWRvICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX2NydWRvX2luZGVjLCBwcmVjaW9fZXhwb19jb210cmFkZV9oc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8pXQ0KcHJlY2lvc19leHBvcnRhY2lvbl9jcnVkb1ssIHZhcmlhYmxlIDo9ICJQcmVjaW9zIGRlIGV4cG9ydGFjacOzbiBkZSBjcnVkbyJdDQpzZXRuYW1lcyhwcmVjaW9zX2V4cG9ydGFjaW9uX2NydWRvLCANCiAgICAgICAgIGMoInByZWNpb19leHBvX3JlZ2FsaWFzX2NydWRvIiwgInByZWNpb19leHBvX21lY29uX2NydWRvIiAsICJwcmVjaW9fZXhwb19jcnVkb19pbmRlYyIsDQogICAgICAgICAgICJwcmVjaW9fZXhwb19jb210cmFkZV9oc19jcnVkbyIsICJwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvIiksDQogICAgICAgICBjKCAiU2VjLiBFbmVyZ8OtYSAtIFJlZ2Fsw61hcyIsICJNRUNPTiIsICJJTkRFQyIsICJVTi1Db210cmFkZSAoSFMpIiwgIlVOLUNvbXRyYWRlIChTSVRDKSIpKQ0KcHJlY2lvc19leHBvcnRhY2lvbl9jcnVkbyA9IG1lbHQocHJlY2lvc19leHBvcnRhY2lvbl9jcnVkbywNCiAgICAgaWQudmFycyA9IGMoImFuaW8iLCAidmFyaWFibGUiLCAidW5pZGFkIiksIA0KICAgICB2YXJpYWJsZS5uYW1lID0gImZ1ZW50ZSIsIHZhbHVlLm5hbWUgPSAidmFsb3IiKQ0KcHJlY2lvc19leHBvcnRhY2lvbl9jcnVkbyA9IHByZWNpb3NfZXhwb3J0YWNpb25fY3J1ZG9bKCFpcy5uYSh2YWxvcikpJiAodmFsb3IgPiAwKV0NCnByZWNpb3NfZXhwb3J0YWNpb25fY3J1ZG9bLCBjb2RpZ29fdmFyaWFibGUgOj0gZmNhc2UoZnVlbnRlID09ICJTZWMuIEVuZXJnw61hIC0gUmVnYWzDrWFzIiwgIlB4X2NydWRvX3JlZ2FsaWFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID09ICJNRUNPTiIsICJQeF9jcnVkb19tZWNvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZSA9PSAiSU5ERUMiLCAgIlB4X2NydWRvX2luZGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID09IlVOLUNvbXRyYWRlIChIUykiLCAgICJQeF9jcnVkb19jb210cmFkZV9ocyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZSA9PSAiVU4tQ29tdHJhZGUgKFNJVEMpIiwgICJQeF9jcnVkb19jb210cmFkZV9zaXRjIiApXSANCg0KI3ByZWNpbyBnYXMgbWRvIGV4dA0KcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVID1hcy5kYXRhLnRhYmxlKHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSkNCnByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVVssIGA6PWAgKCJwcmVjaW9fZXh0ZXJub19nYXMiID0gTlVMTCwgInByZWNpb19leHBvcnRhY2lvbl9nYXNfYXIiID1OVUxMKSBdDQoNCiNwcmVjaW8gcmVmZXJlbmNpYSBnYXMNCnByZWNpb3NfcmVmZXJlbmNpYV9nYXMgPSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFVbLCBjKDE6MjEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXAoInByZWNpb19leHBvX2JvbGl2aWFfYXJnX3lwZmIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMocHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVKSkgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcCgicHJlY2lvX2V4cG9fYm9saXZpYV9iemxfeXBmYiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyhwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUpKSAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXAoInByZWNpb19pbXBvX2dhc19hcmdfYm9saXZpYV9jb210cmFkZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyhwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUpKSAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXAoInByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19jb210cmFkZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyhwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUpKSAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXAoInByZWNpb19pbXBvX2dhc19ib2xpdmlhX2lkZWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMocHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVKSkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIHdpdGggPSBGXQ0KcHJlY2lvc19yZWZlcmVuY2lhX2dhc1sgICwgYDo9YCAoImJwX2dhc19oZW5yeV9odWIiID0gTlVMTCwgImZtaV9oZW5yeV9odWIiID0gTlVMTCkgXQ0Kc2V0bmFtZXMocHJlY2lvc19yZWZlcmVuY2lhX2dhcywgDQogICAgICAgICBjKCJ1c193ZWxsaGVhZF9nYXNfcHJpY2UiLCAgInVzX2ltcG9ydF9nYXNfcHJpY2UiLCAidXNfcGlwZWxpbmVfaW1wb3J0X3ByaWNlIiwgInVzX2xuZ19pbXBvcnRfcHJpY2UiLCANCiAgICAgICAgICAgInVzX2V4cG9ydF9nYXNfcHJpY2UiICAgLCAgICAgICAidXNfZXhwb3J0X2dhc19waXBlbGluZV9wcmljZSIsICJ1c19leHBvcnRfbG5nX3ByaWNlIiwNCiAgICAgICAgICAgImVpYV9oZW5yeV9odWJfc3BvdCIsICJicF9sbmdfamFwYW5fY2lmIiwgImJwX2xuZ19qa20iLCAiYnBfZ2FzX2dlcm1hbl9pbXBvcnRfcHJpY2UiLA0KICAgICAgICAgICAiYnBfZ2FzX25icCIsICJicF9nYXNfbmV0aGVybGFuZHNfdHRmIiwgICAiYnBfZ2FzX2NhbmFkYSIsDQogICAgICAgICAgICJicF9vaWxfbWl4X21lYW5fb2VjZCIsICAiZm1pX2xuZ19hc2lhIiwgImZtaV9uYXR1cmFsX2dhc19ldSIsDQogICAgICAgICAgICJwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ195cGZiIiwgInByZWNpb19leHBvX2JvbGl2aWFfYnpsX3lwZmIiLA0KICAgICAgICAgICAicHJlY2lvX2ltcG9fZ2FzX2FyZ19ib2xpdmlhX2NvbXRyYWRlIiwgInByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19jb210cmFkZSIsDQogICAgICAgICAgICJwcmVjaW9faW1wb19nYXNfYm9saXZpYV9pZGVlIg0KICAgICAgICAgICApLA0KICAgICAgICAgYygiUGV4dF9nYXNfdXNfd2VsbGhlYWQiLCAgIlBleHRfZ2FzX3VzX2ltcG9ydCIsICJQZXh0X2dhc191c19waXBlbGluZV9pbXBvcnQiLCAiUGV4dF9sbmdfdXNfaW1wb3J0IiwgDQogICAgICAgICAgICJQZXh0X3VzX2V4cG9ydF9nYXMiICAgLCAgICJQZXh0X2dhc19waXBlbGluZV91c19leHBvcnQiLCAiUGV4dF9sbmdfdXNfZXhwb3J0IiwNCiAgICAgICAgICAgIlBleHRfaGVucnlfaHViX3Nwb3QiLCAiUGV4dF9sbmdfamFwYW5fY2lmIiwgIlBleHRfbG5nX2prbSIsICJQZXh0X2dhc19nZXJtYW5faW1wb3J0IiwNCiAgICAgICAgICAgIlBleHRfbmJwX2dhcyIsICJQZXh0X3R0Zl9nYXMiLCAgICJQZXh0X2NhbmFkYV9nYXMiLA0KICAgICAgICAgICAiUGV4dF9vaWxfbWl4X21lYW5fb2VjZCIsICAiUGV4dF9hc2lhX2xuZyIsICJQZXh0X2V1X2dhcyIsDQogICAgICAgICAgICJQeF9nYXNfYm9sX2FyZ195cGZiIiwgIlB4X2dhc19ib2xfYnpsX3lwZmIiLA0KICAgICAgICAgICAiUG1fZ2FzX2FyZ19ib2xfY29tdHJhZGUiLCAiUG1fZ2FzX2JvbF9hcmdfY29tdHJhZGUiLA0KICAgICAgICAgICAiUG1fZ2FzX2FyZ19ib2xfaWRlZSIpDQogICAgICAgICApDQpwcmVjaW9zX3JlZmVyZW5jaWFfZ2FzID0gbWVsdChwcmVjaW9zX3JlZmVyZW5jaWFfZ2FzLA0KICAgICBpZC52YXJzID0gYygiYW5pbyIsICAidW5pZGFkIiksIA0KICAgICB2YXJpYWJsZS5uYW1lID0gImNvZGlnb192YXJpYWJsZSIsIHZhbHVlLm5hbWUgPSAidmFsb3IiKQ0KcHJlY2lvc19yZWZlcmVuY2lhX2dhc1ssIHZhcmlhYmxlIDo9IGZjYXNlKA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfZ2FzX3VzX3dlbGxoZWFkIiwgIlByZWNpbyBkZWwgZ2FzIG5hdHVyYWwgYm9jYSBkZSBwb3pvIGVuIEVzdGFkb3MgVW5pZG9zIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQZXh0X2dhc191c19pbXBvcnQiLCAiUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBnYXMgbmF0dXJhbCBlbiBFc3RhZG9zIFVuaWRvcyIsIA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfZ2FzX3VzX3BpcGVsaW5lX2ltcG9ydCIsICAiUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBnYXMgbmF0dXJhbCBwb3IgdHViZXLDrWFzIGVuIEVzdGFkb3MgVW5pZG9zIiAsDQogIGNvZGlnb192YXJpYWJsZSA9PSAiUGV4dF9sbmdfdXNfaW1wb3J0IiAsICJQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIEdOTCBlbiBFc3RhZG9zIFVuaWRvcyIsDQogIGNvZGlnb192YXJpYWJsZSA9PSAiUGV4dF91c19leHBvcnRfZ2FzIiAsICJQcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIGdhcyBuYXR1cmFsIGVuIEVzdGFkb3MgVW5pZG9zIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICAiUGV4dF9nYXNfcGlwZWxpbmVfdXNfZXhwb3J0IiwiUHJlY2lvIGRlIGV4cG9ydGFjacOzbiBkZSBnYXMgbmF0dXJhbCBwb3IgdHViZXLDrWFzIGVuIEVzdGFkb3MgVW5pZG9zIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQZXh0X2xuZ191c19leHBvcnQiLCAiUHJlY2lvIGRlIGV4cG9ydGFjacOzbiBkZSBHTkwgZW4gRXN0YWRvcyBVbmlkb3MiLA0KICBjb2RpZ29fdmFyaWFibGUgPT0gICJQZXh0X2hlbnJ5X2h1Yl9zcG90IiwgICJQcmVjaW8gSGVucnkgaHViIHNwb3QgZGVsIGdhcyBuYXR1cmFsIGVuIEVzdGFkb3MgVW5pZG9zIiwgDQogIGNvZGlnb192YXJpYWJsZSA9PSAgIlBleHRfbG5nX2phcGFuX2NpZiIsICJQcmVjaW8gQ0lGIGRlbCBHTkwgZW4gSmFww7NuIiwgDQogIGNvZGlnb192YXJpYWJsZSA9PSAgIlBleHRfbG5nX2prbSIsICJQcmVjaW8gSmFwYW4gS29yZWEgTWFya2VyIGRlbCBHTkwiLA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfZ2FzX2dlcm1hbl9pbXBvcnQiLCAiUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBnYXMgbmF0dXJhbCBlbiBBbGVtYW5pYSIsDQogIGNvZGlnb192YXJpYWJsZSA9PSJQZXh0X25icF9nYXMiLCAiUHJlY2lvIE5CUCBkZWwgZ2FzIG5hdHVyYWwgZW4gSW5nbGF0ZXJyYSIsIA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfdHRmX2dhcyIsICJQcmVjaW8gVFRGIGRlbCBnYXMgbmF0dXJhbCBlbiBIb2xhbmRhIiwgDQogIGNvZGlnb192YXJpYWJsZSA9PSAiUGV4dF9jYW5hZGFfZ2FzIiwgIlByZWNpbyBBbGJlcnRhIGRlbCBnYXMgbmF0dXJhbCBlbiBDYW5hZMOhIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQZXh0X29pbF9taXhfbWVhbl9vZWNkIiwgIlByZWNpbyBDSUYgbWl4IE9DREUiLA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfYXNpYV9sbmciLCAiUHJlY2lvIGRlbCBMTkcgZW4gQXNpYSIsIA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfZXVfZ2FzIiwgIlByZWNpbyBkZWwgZ2FzIG5hdHVyYWwgZW4gbGEgVUUiLA0KICBjb2RpZ29fdmFyaWFibGUgPT0iUHhfZ2FzX2JvbF9hcmdfeXBmYiIsICAiUHJlY2lvIGRlIGV4cG9ydGFjacOzbiBkZSBnYXMgbmF0dXJhbCBkZSBZUEZCIGhhY2lhIEFyZ2VudGluYSIsDQogIGNvZGlnb192YXJpYWJsZSA9PSAiUHhfZ2FzX2JvbF9iemxfeXBmYiIsICJQcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIGdhcyBuYXR1cmFsIGRlIFlQRkIgaGFjaWEgQnJhemlsIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQbV9nYXNfYXJnX2JvbF9jb210cmFkZSIsICJQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIGdhcyBuYXR1cmFsIGRlIEFyZ2VudGluYSBkZXNkZSBCb2xpdmlhIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQbV9nYXNfYm9sX2FyZ19jb210cmFkZSIsICJQcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIGdhcyBuYXR1cmFsIGRlc2RlIEJvbGl2aWEgaGFjaWEgQXJnZW50aW5hIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICAiUG1fZ2FzX2FyZ19ib2xfaWRlZSIgLCAiUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBnYXMgbmF0dXJhbCBkZSBBcmdlbnRpbmEgZGVzZGUgQm9saXZpYSAoSURFRSkiDQogICAgICAgICAgICkgIF0NCnByZWNpb3NfcmVmZXJlbmNpYV9nYXNbLCBmdWVudGUgOj0gZmNhc2UoDQogIGNvZGlnb192YXJpYWJsZSA9PSAiUGV4dF9nYXNfdXNfd2VsbGhlYWQiLCAiRUlBIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQZXh0X2dhc191c19pbXBvcnQiLCAiRUlBIiwgDQogIGNvZGlnb192YXJpYWJsZSA9PSAiUGV4dF9nYXNfdXNfcGlwZWxpbmVfaW1wb3J0IiwiRUlBIiAsDQogIGNvZGlnb192YXJpYWJsZSA9PSAiUGV4dF9sbmdfdXNfaW1wb3J0IiAsICJFSUEiLA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfdXNfZXhwb3J0X2dhcyIgLCAiRUlBIiAsDQogIGNvZGlnb192YXJpYWJsZSA9PSAgIlBleHRfZ2FzX3BpcGVsaW5lX3VzX2V4cG9ydCIsIkVJQSIgLA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfbG5nX3VzX2V4cG9ydCIsIkVJQSIsDQogIGNvZGlnb192YXJpYWJsZSA9PSAgIlBleHRfaGVucnlfaHViX3Nwb3QiLCJFSUEiLCANCiAgY29kaWdvX3ZhcmlhYmxlID09ICAiUGV4dF9sbmdfamFwYW5fY2lmIiwgIkJyaXRpc2ggUGV0cm9sZXVtIiwgDQogIGNvZGlnb192YXJpYWJsZSA9PSAgIlBleHRfbG5nX2prbSIsICJCcml0aXNoIFBldHJvbGV1bSIsDQogIGNvZGlnb192YXJpYWJsZSA9PSAiUGV4dF9nYXNfZ2VybWFuX2ltcG9ydCIsIkJyaXRpc2ggUGV0cm9sZXVtIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09IlBleHRfbmJwX2dhcyIsICJCcml0aXNoIFBldHJvbGV1bSIsIA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfdHRmX2dhcyIsIkJyaXRpc2ggUGV0cm9sZXVtIiwgDQogIGNvZGlnb192YXJpYWJsZSA9PSAiUGV4dF9jYW5hZGFfZ2FzIiwgIkJyaXRpc2ggUGV0cm9sZXVtIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQZXh0X29pbF9taXhfbWVhbl9vZWNkIiwgIkJyaXRpc2ggUGV0cm9sZXVtIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQZXh0X2FzaWFfbG5nIiwgIkZNSSIsIA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBleHRfZXVfZ2FzIiwgIkZNSSIsDQogIGNvZGlnb192YXJpYWJsZSA9PSJQeF9nYXNfYm9sX2FyZ195cGZiIiwgICJZUEZCIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQeF9nYXNfYm9sX2J6bF95cGZiIiwgIllQRkIiLA0KICBjb2RpZ29fdmFyaWFibGUgPT0gIlBtX2dhc19hcmdfYm9sX2NvbXRyYWRlIiwgIlVOIENvbXRyYWRlIiwNCiAgY29kaWdvX3ZhcmlhYmxlID09ICJQbV9nYXNfYm9sX2FyZ19jb210cmFkZSIsICJVTiBDb210cmFkZSIsDQogIGNvZGlnb192YXJpYWJsZSA9PSAgIlBtX2dhc19hcmdfYm9sX2lkZWUiICwgIklERUUiDQogICAgICAgICAgICkgIF0NCnByZWNpb3NfcmVmZXJlbmNpYV9nYXMgPSBwcmVjaW9zX3JlZmVyZW5jaWFfZ2FzWyFpcy5uYSh2YWxvciksXQ0KDQojcHJlY2lvIGV4cG9ydGFjaW9uIGdhcw0KcHJlY2lvc19leHBvcnRhY2lvbl9nYXMgPSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFVbLCBjKDE6MiwgMjY6MjkpLCB3aXRoID0gRl0NCnNldG5hbWVzKHByZWNpb3NfZXhwb3J0YWNpb25fZ2FzLCANCiAgICAgICAgIGMoInByZWNpb19leHBvX2dhc19jb210cmFkZSIsICJwcmVjaW9fZXhwb19nYXNfcmVnYWxpYXMiLCAgInByZWNpb19leHBvX2dhc19pbmRlYyIsIA0KICAgICAgICAgInByZWNpb19leHBvX2dhc19tZWNvbiIgKSAsDQogICAgICAgICBjKCJQeF9nYXNfY29tdHJhZGUiLCAiUHhfZ2FzX3JlZ2FsaWFzIiwgIlB4X2dhc19pbmRlYyIsICJQeF9nYXNfbWVjb24iKSkNCnByZWNpb3NfZXhwb3J0YWNpb25fZ2FzID0gbWVsdChwcmVjaW9zX2V4cG9ydGFjaW9uX2dhcywNCiAgICAgaWQudmFycyA9IGMoImFuaW8iLCAgInVuaWRhZCIpLCANCiAgICAgdmFyaWFibGUubmFtZSA9ICJjb2RpZ29fdmFyaWFibGUiLCB2YWx1ZS5uYW1lID0gInZhbG9yIikNCnByZWNpb3NfZXhwb3J0YWNpb25fZ2FzID0gcHJlY2lvc19leHBvcnRhY2lvbl9nYXNbIWlzLm5hKHZhbG9yKSxdDQpwcmVjaW9zX2V4cG9ydGFjaW9uX2dhc1ssIGZ1ZW50ZSA6PSBmY2FzZSggDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnb192YXJpYWJsZSA9PSAiUHhfZ2FzX2NvbXRyYWRlIiwiVU4tQ29tdHJhZGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnb192YXJpYWJsZSA9PSJQeF9nYXNfcmVnYWxpYXMiLCJTZWMuIEVuZXJnw61hIC0gUmVnYWzDrWFzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnb192YXJpYWJsZSA9PSJQeF9nYXNfaW5kZWMiLCAiSU5ERUMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnb192YXJpYWJsZSA9PSAiUHhfZ2FzX21lY29uIiwgIk1FQ09OIiApXQ0KcHJlY2lvc19leHBvcnRhY2lvbl9nYXNbLHZhcmlhYmxlIDo9ICJQcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIGdhcyBuYXR1cmFsIGRlIEFyZ2VudGluYSJdDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIENhbGN1bG9zDQpyZW50YV9pbmRpcmVjdG9fcGJpID0gYXMuZGF0YS50YWJsZShyZW50YV9pbmRpcmVjdG8pDQpyZW50YV9pbmRpcmVjdG9fcGJpID0gcmVudGFfaW5kaXJlY3RvX3BiaVthbmlvID4xOTYxLGMoMSwxODoxOSldICANCnNldG5hbWVzKHJlbnRhX2luZGlyZWN0b19wYmksIGMoInJlbnRhX3B2IiwgInJlbnRhX3BiaSIpLCBjKCJSdnNQViIsICJSdnNQQkkiKSApDQoNCiMNCnJlbnRhX2luZGlyZWN0byA9IGFzLmRhdGEudGFibGUocmVudGFfaW5kaXJlY3RvKQ0KcmVudGFfaW5kaXJlY3RvID0gcmVudGFfaW5kaXJlY3RvW2FuaW8gPiAxOTYxLGMoMToyLCA2OjEyLCAxNikgXQ0Kc2V0bmFtZXMocmVudGFfaW5kaXJlY3RvLCANCiAgICAgICAgYygicmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbyIsICJyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyIgICwNCiAgICAgICAgICAicmV0ZW5jaW9uZXMiLCAicmVnYWxpYXNfdG90YWwiLCAicmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8iICAsDQogICAgICAgICAgInJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcyIgLCJzdWJzaWRpb3MiLCAicmVudGFfdG90YWwiICApLCANCiAgICAgICAgYygiUmRpZnBfY3J1ZG8iLCJSZGlmcF9nYXMiICwgIlJyZXQiLCAiUnJlZyIsICJSc3Z4X2NydWRvIiwgIlJzdnhfZ2FzIiwgIlN1YnMiLCAiUnR0IiAgKQ0KICAgICAgICApDQojIHJlbnRhX2luZGlyZWN0b1sgLGA6PWAgIChScmV0ID0gZmNhc2UoUnJldCA9PSAwLCBOQSxkZWZhdWx0ID0gUnJldCksIFJyZWcgPSBmY2FzZShScmVnID09IDAsIE5BLCBkZWZhdWx0ID0gUnJlZyksICANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnMgPSBmY2FzZShTdWJzID09IDAsIE5BLCBkZWZhdWx0PVN1YnMpKV0NCiMgcmVudGFfaW5kaXJlY3RvWywgbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkgaWZlbHNlKHg9PTAsIE5BLCB4KSksIC5TRGNvbHMgPSBjKCJScmV0IiwgIlJyZWciLCAiU3VicyIpXQ0KcmVudGFfaW5kaXJlY3RvW1JyZXQgPT0gMCwgUnJldCA6PSBOQV0NCnJlbnRhX2luZGlyZWN0b1tScmVnID09IDAsIFJyZWcgOj0gTkFdDQpyZW50YV9pbmRpcmVjdG9bU3VicyA9PSAwLCBTdWJzIDo9IE5BXQ0KDQoNCiMNCnJlbnRhX2RpcmVjdG89IGFzLmRhdGEudGFibGUocmVudGFfZGlyZWN0bykNCnJlbnRhX2RpcmVjdG9bLCBpcGNfMTggOj0gTlVMTF0NCnNldG5hbWVzKHJlbnRhX2RpcmVjdG8sIA0KICAgICAgICAgYygicHB5ZSIsICJ0Z19oaWRyb2NhcmJ1cm9zIiwgInRnX25vcm1hbCIgLCAicHYiLCAic3Vic2lkaW9zIiwgImdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MiLCAicmVudGFfdG90YWwiICksDQogICAgICAgICBjKCJLY2ZhIiwgIlRHX3B5ZyIsICJUR25vcm0iLCAiUFYiLCAiU3VicyIsICAiR25vcm1fcHlnIiwgIlJ0dCIpDQogICAgICAgICApDQoNCiMNCnJlbnRhX2RpcmVjdG9fcGJpID0gYXMuZGF0YS50YWJsZShyZW50YV9kaXJlY3RvX3BiaSkNCnJlbnRhX2RpcmVjdG9fcGJpID0gcmVudGFfZGlyZWN0b19wYmlbLGMoMSwxNDoxNSldICAgICAgICAgICAgDQpzZXRuYW1lcyhyZW50YV9kaXJlY3RvX3BiaSwgYygicmVudGFfcHYiLCAicmVudGFfcGJpIiksIGMoIlJ2c1BWIiwgIlJ2c1BCSSIpICkNCg0KIw0KY3J1ZG9fc29icmV2YWx1YWNpb24gPSBhcy5kYXRhLnRhYmxlKHJlbnRhX3RjcF9jcnVkb1ssLWMoMTI6MTMpXSkNCnNldG5hbWVzKGNydWRvX3NvYnJldmFsdWFjaW9uLCAicmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8iLCAiUnN2eCIpDQpjcnVkb19zb2JyZXZhbHVhY2lvbiA9IGNydWRvX3NvYnJldmFsdWFjaW9uWyghaXMubmEoUnN2eCkpICYgKFJzdnggIT0gMCkgICwuKGFuaW8sIFJzdngpIF0NCg0KIw0KY3J1ZG9fZGlmX3ByZWNpb3MgPSBhcy5kYXRhLnRhYmxlKHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvWywtMTRdKQ0Kc2V0bmFtZXMoY3J1ZG9fZGlmX3ByZWNpb3MsIGMoICJwcm9kX2NydWRvIiwgImV4cG9fY3J1ZG8iLCAiZXhpc3RlbmNpYXNfY3J1ZG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kX21kb19pbnRlcm5vIiAsInByZWNpb19pbnRlcm5vX2NydWRvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY2lvX2V4dGVybm9fY3J1ZG8iICAgLCJ0Y2MiICwgICJ0Y3AiLCAgInJlbnRhX2RpZl9wcmVjaW9zX2NydWRvIiksDQogICAgICAgICBjKCJRX2NydWRvIiwgIlhfY3J1ZG8iLCAiRXhfY3J1ZG8iLCAiUW1kb2ludF9jcnVkbyIsICJQaV9jcnVkbyIsICJQZXh0X2NydWRvIiwgIlRDYyIsICJUQ3AiLCAiUmRpZnBfY3J1ZG8iKQ0KICAgICAgICAgKQ0KY3J1ZG9fZGlmX3ByZWNpb3MgPSBjcnVkb19kaWZfcHJlY2lvc1tjcnVkb19zb2JyZXZhbHVhY2lvbiwgb24gPSAuKGFuaW8gPSBhbmlvKSBdDQojIGNydWRvX2RpZl9wcmVjaW9zID0gY3J1ZG9fZGlmX3ByZWNpb3NbKCFpcy5uYShSZGlmcCkpICYoIWlzLm5hKFJzdngpKSBdDQpjcnVkb19kaWZfcHJlY2lvc1tFeF9jcnVkbyA9PSAwLCBFeF9jcnVkbyA6PSBOQV0NCmNydWRvX2RpZl9wcmVjaW9zW1hfY3J1ZG8gPT0gMCwgWF9jcnVkbyA6PSBOQV0NCg0KDQojDQpnYXNfc29icmV2YWx1YWNpb24gPSBhcy5kYXRhLnRhYmxlKHJlbnRhX3RjcF9nYXMpDQpzZXRuYW1lcyhnYXNfc29icmV2YWx1YWNpb24sICJyZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMiLCAiUnN2eCIpDQpnYXNfc29icmV2YWx1YWNpb24gPSBnYXNfc29icmV2YWx1YWNpb25bKCFpcy5uYShSc3Z4KSkgJiAoUnN2eCAhPSAwKSAgLC4oYW5pbywgUnN2eCkgXQ0KDQoNCiMNCmdhc19kaWZfcHJlY2lvcyA9IGFzLmRhdGEudGFibGUocmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXNbLC0xM10pDQpzZXRuYW1lcyhnYXNfZGlmX3ByZWNpb3MsIGMoICJwcm9kX2dhcyIsICJleHBvX2dhcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kX21kb19pbnRlcm5vIiAsInByZWNpb19pbnRlcm5vX2dhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpb19leHRlcm5vX2dhcyIgICAsInRjYyIgLCAgInRjcCIsICAicmVudGFfZGlmX3ByZWNpb3NfZ2FzIiksDQogICAgICAgICBjKCJRX2dhcyIsICJYX2dhcyIsICAiUW1kb2ludF9nYXMiLCAiUGlfZ2FzIiwgIlBleHRfZ2FzIiwgIlRDYyIsICJUQ3AiLCAiUmRpZnBfZ2FzIikNCiAgICAgICAgICkNCmdhc19kaWZfcHJlY2lvcyA9IGdhc19kaWZfcHJlY2lvc1tnYXNfc29icmV2YWx1YWNpb24sIG9uID0gLihhbmlvID0gYW5pbykgXQ0KZ2FzX2RpZl9wcmVjaW9zID0gZ2FzX2RpZl9wcmVjaW9zWyFpcy5uYShSZGlmcF9nYXMpXQ0KZ2FzX2RpZl9wcmVjaW9zW1hfZ2FzID09IDAsIFhfZ2FzIDo9IE5BXQ0KDQojDQpyZXRlbmNpb25lc19wZyA9IGFzLmRhdGEudGFibGUocmV0ZW5jaW9uZXNfY3J1ZG8pDQpyZXRlbmNpb25lc19wZ1ssIHVuaWRhZCA6PSAiUGVzb3MgY29ycmllbnRlcyJdDQoNCnJldGVuY2lvbmVzX3BnX2pvaW4gPSByZXRlbmNpb25lc19wZ1ssIC4oYW5pbywgcmV0ZW5jaW9uZXNfY3J1ZG9famspXQ0Kc2V0bmFtZXMocmV0ZW5jaW9uZXNfcGdfam9pbiwgInJldGVuY2lvbmVzX2NydWRvX2prIiwgIlJyZXQiKQ0KDQpyZXRlbmNpb25lc19wZyA9IG1lbHQocmV0ZW5jaW9uZXNfcGcsIGlkLnZhcnMgPSBjKCJhbmlvIiwgInVuaWRhZCIpLA0KICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAidmFyIiwgdmFsdWUubmFtZSA9ICJ2YWxvciIpDQpyZXRlbmNpb25lc19wZ1ssIHZhcmlhYmxlIDo9ICJSZXRlbmNpb25lcyBhIGxhcyBleHBvcnRhY2lvbmVzIGhpZHJvY2FyYnVyw61mZXJhcyJdDQpyZXRlbmNpb25lc19wZ1ssIGNvZGlnb192YXJpYWJsZSA6PSAiUnJldCJdDQpyZXRlbmNpb25lc19wZ1ssIGZ1ZW50ZSA6PSBmY2FzZSh2YXIgPT0gInJldGVuY2lvbmVzX2NydWRvX2prIiwgIkFGSVAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyID09ICJyZXRlbmNpb25lc19jcnVkb19iZnIiLCAiRXN0aW1hY2nDs24gZWxhYm9yYWRhIHBvciBCaWwgeSBGw6FyZmFybyBSdWl6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcj09ICJyZXRlbmNpb25lc19oYyIsICJFc3RpbWFjacOzbiBlbGFib3JhZGEgcG9yIENhbXBvZMOzbmljbyIpXQ0KcmV0ZW5jaW9uZXNfcGdbLCB2YXIgOj1OVUxMXQ0KDQojDQpyZWdhbGlhc19wZyA9IGFzLmRhdGEudGFibGUocmVnYWxpYXMpDQpyZWdhbGlhc19wZ1ssIHVuaWRhZCA6PSAiUGVzb3MgY29ycmllbnRlcyJdDQpyZWdhbGlhc19wZ1ssIGA6PWAgKHJlZ2FsaWFzX2ZyID0gTlVMTCwgcmVnYWxpYXNfdG90YWw9TlVMTCkgXQ0Kc2V0bmFtZXMocmVnYWxpYXNfcGcgLCJyZWdhbGlhc19zZSIsICJScmVnIikNCnJlZ2FsaWFzX3BnID0gcmVnYWxpYXNfcGdbIShpcy5uYShScmVnKSldDQoNCnJlZ2FsaWFzX3RvX3ZhcnMgPSBtZWx0KHJlZ2FsaWFzX3BnLCBpZC52YXJzID0gYygiYW5pbyIsICJ1bmlkYWQiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gImNvZGlnb192YXJpYWJsZSIsIHZhbHVlLm5hbWUgPSAidmFsb3IiICkNCnJlZ2FsaWFzX3RvX3ZhcnNbLCBmdWVudGUgOj0gIlNlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gUmVnYWzDrWFzIl0NCnJlZ2FsaWFzX3RvX3ZhcnNbLCB2YXJpYWJsZSA6PSAiUmVnYWzDrWFzIHByb3ZpbmNpYWxlcyBwb3IgbGEgcHJvZHVjY2nDs24gZGUgaGlkcm9jYXJidXJvcyJdDQoNCiMNCnN1YnNpZGlvc19wZyA9IGFzLmRhdGEudGFibGUoc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MpDQpzdWJzaWRpb3NfcGcgPSBzdWJzaWRpb3NfcGdbICEoaXMubmEoc3Vic2lkaW9zX2NlZmlwKSldDQoNCnN1YnNpZGlvc19wZ19qb2luID0gc3Vic2lkaW9zX3BnWywgLihhbmlvLCBzdWJzaWRpb3NfY2VmaXApXQ0Kc2V0bmFtZXMoc3Vic2lkaW9zX3BnX2pvaW4sICJzdWJzaWRpb3NfY2VmaXAiLCAiU3VicyIpDQoNCnNldG5hbWVzKHN1YnNpZGlvc19wZywgYygic3Vic2lkaW9zX2VqZXMiLCAic3Vic2lkaW9zX2NlZmlwIikgLCBjKCJFSkVTIiwgIkNFRklQIikpDQpzdWJzaWRpb3NfcGc9IG1lbHQoc3Vic2lkaW9zX3BnLCBpZC52YXJzPWMoImFuaW8iLCAidW5pZGFkIiksDQogICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJmdWVudGUiLCB2YWx1ZS5uYW1lID0gInZhbG9yIikNCnN1YnNpZGlvc19wZyA9c3Vic2lkaW9zX3BnWyghaXMubmEodmFsb3IpKSAmICh2YWxvciAhPSAwKV0NCnN1YnNpZGlvc19wZ1ssIHZhcmlhYmxlIDo9ICJTdWJzaWRpb3MgYSBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMiXQ0Kc3Vic2lkaW9zX3BnWywgY29kaWdvX3ZhcmlhYmxlIDo9ICJTdWJzIl0NCg0KIyBqb2luIHRyaWJ1dG9zDQpyZWdfcmV0ID0gbWVyZ2UocmVnYWxpYXNfcGcsIHJldGVuY2lvbmVzX3BnX2pvaW4sIGJ5PSJhbmlvIiAsIGFsbC54PVQpDQpyZWdfcmV0X3N1YnMgPSBtZXJnZShyZWdfcmV0LCBzdWJzaWRpb3NfcGdfam9pbiwgYnkgPSAiYW5pbyIsIGFsbC54ID0gVCkNCg0KIw0KdGdfcGdfdG90YWwgPSBhcy5kYXRhLnRhYmxlKHJlbnRhX3RnKQ0KdGdfcGdfdG90YWwgPSB0Z19wZ190b3RhbFssIC4oYW5pbywgdW5pZGFkLCBzdG9ja19zZWxlY2Npb25hZG8sIHBweWUsIHRnX2hpZHJvY2FyYnVyb3MsIHVuaW9uX3RnICxyZW50YV9jb25fdGdfdW5pb24pXQ0Kc2V0bmFtZXModGdfcGdfdG90YWwsIGMoICJwcHllIiwgInRnX2hpZHJvY2FyYnVyb3MiLCAidW5pb25fdGciICwicmVudGFfY29uX3RnX3VuaW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgYygiS2NmYSIsICJUR19wZyIsICJUR19tYW51ZiIsICJSa2luZHYiICkgICApDQpjb2xzID0gYygiS2NmYSIsICJSa2luZHYiKQ0KIyB0Z19wZ190b3RhbFssY29scyA6PSBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB4ICogMTBeNiksIC5TRGNvbHM9Y29scyBdDQp0Z19wZ190b3RhbFssIGA6PWAgKFJraW5kdiA9IFJraW5kdiAqIDEwXjYsIEtjZmEgPSBLY2ZhICoxMF42LCB1bmlkYWQgPSAiUGVzb3MgY29ycmllbnRlcyIpIF0NCnRnX3BnX3RvdGFsDQoNCiMNCnRnX3BnX2VtcHJlc2FzID0gYXMuZGF0YS50YWJsZShyZW50YV9lbXByZXNhc19iYWxhbmNlcykNCnRnX3BnX2VtcHJlc2FzWyxjKCAiZmVjaGEiLCAiZW1wcmVzYSIsICJzZWN0b3IiLCAibW9uZWRhIiAsIktUQSIsICAiZ2NpYV9hbnQiICAsIA0KICAgICAgICAgICAgICAgICAgICJ0Z19hbnQiICwgInRnX2Rlc3AiKV0NCg0KIw0KY2Nubl9wZyA9IGFzLmRhdGEudGFibGUoY2Nubl9vZmljaWFsKQ0KY29scyA9IGMoImFuaW8iLCAidW5pZGFkIiwgImZ1ZW50ZSIsDQogICAgICAgICAidmJwX3RvdCIsICAgImNpX3RvdCIsInZhX3RvdCIgICwibXNfdG90IiwgICJlYmVfdG90IiAsDQogICAgICAgICAidmJwX2V4dHIiICwgICAgImNpX2V4dHIiICwidmFfZXh0ciIgLCJtc19leHRyIiAgLCAiZWJlX2V4dHIiKQ0KY2Nubl9wZyA9IGNjbm5fcGdbLGNvbHMsIHdpdGg9Rl0NCnNldG5hbWVzKGNjbm5fcGcsIGMoInZicF90b3QiLCAidmFfdG90IiAgLCAgImNpX3RvdCIsIm1zX3RvdCIsICAiZWJlX3RvdCIgLA0KICAgICAgICAgInZicF9leHRyIiAsICJ2YV9leHRyIiAsICAgImNpX2V4dHIiICwibXNfZXh0ciIgICwgImViZV9leHRyIikgLA0KICAgICAgICAgYygiVkJQX3B5ZyIsICJWQV9weWciLCAiQ0lfcHlnIiwgIkt2Y19weWciLCAiR19weWciLA0KICAgICAgICAgICAiVkJQX2V4dHIiLCAiVkFfZXh0ciIsICJDSV9leHRyIiwgIkt2Y19leHRyIiwgIkdfZXh0ciIpDQogICAgICAgICApDQoNCiMNCmNyaXRlcmlvX2Njbm5fcGcgPSBhcy5kYXRhLnRhYmxlKGNyaXRlcmlvX2Njbm4pDQpjb2xzID0gYygiYW5pbyIsICJ1bmlkYWQiLCAiZnVlbnRlIiwNCiAgICAgICAgICJ2YnBfdG90IiwgInZicF9leHRyIiwNCiAgICAgICAgICJjb2VmX2NpIiwgImNpX3RvdCIsICJjaV9leHRyIiwNCiAgICAgICAgICJ2YV90b3QiICwgInZhX2V4dHIiLCAibXNfZXh0ciIgLCAibXNfdG90IiAsIA0KICAgICAgICAgImViZV90b3QiLCAiZWJlX2V4dHIiICAgKQ0KY3JpdGVyaW9fY2Nubl9wZyA9IGNyaXRlcmlvX2Njbm5fcGdbLCBjb2xzLCB3aXRoPUZdDQpjcml0ZXJpb19jY25uX3BnID0gY3JpdGVyaW9fY2Nubl9wZ1tjb21wbGV0ZS5jYXNlcyhjcml0ZXJpb19jY25uX3BnKV0NCnNldG5hbWVzKGNyaXRlcmlvX2Njbm5fcGcgLCANCiAgICAgICAgIGMoInZicF90b3QiLCAidmJwX2V4dHIiLA0KICAgICAgICAgImNvZWZfY2kiLCAiY2lfdG90IiwgImNpX2V4dHIiLA0KICAgICAgICAgInZhX3RvdCIgLCAidmFfZXh0ciIsICJtc19leHRyIiAsICJtc190b3QiICwgDQogICAgICAgICAiZWJlX3RvdCIsICJlYmVfZXh0ciIgICksDQogICAgICAgICBjKCJWQlBfZ3lwIiwgIlZCUF9leHRyIiwNCiAgICAgICAgICJjb2VmX0NJIiwgIkNJX2d5cCIsICJDSV9leHRyIiwNCiAgICAgICAgICJWQV9neXAiICwgIlZBX2V4dHIiLCAiS3ZjX2V4dHIiICwgIkt2Y19neXAiICwgDQogICAgICAgICAiR19neXAiLCAiR19leHRyIikgKQ0KDQojDQplbXBhbG1lX2Njbm5fcGcgPSBhcy5kYXRhLnRhYmxlKGVtcGFsbWVfY2NubikNCmNvbHMgPSBjKCJhbmlvIiwgInVuaWRhZCIsICJmdWVudGUiLA0KICAgICAgICAgInZicF90b3QiLCAidmJwX2V4dHIiLA0KICAgICAgICAgImNvZWZfY2kiLCAiY2lfdG90IiwgImNpX2V4dHIiLA0KICAgICAgICAgInZhX3RvdCIgLCAidmFfZXh0ciIsICJtc19leHRyIiAsICJtc190b3QiICwgDQogICAgICAgICAiZWJlX3RvdCIsICJlYmVfZXh0ciIgICApDQplbXBhbG1lX2Njbm5fcGcgPSBlbXBhbG1lX2Njbm5fcGdbLCBjb2xzLCB3aXRoPUZdDQplbXBhbG1lX2Njbm5fcGcgPSBlbXBhbG1lX2Njbm5fcGdbY29tcGxldGUuY2FzZXMoZW1wYWxtZV9jY25uX3BnKV0NCnNldG5hbWVzKGVtcGFsbWVfY2Nubl9wZyAsIA0KICAgICAgICAgYygidmJwX3RvdCIsICJ2YnBfZXh0ciIsDQogICAgICAgICAiY29lZl9jaSIsICJjaV90b3QiLCAiY2lfZXh0ciIsDQogICAgICAgICAidmFfdG90IiAsICJ2YV9leHRyIiwgIm1zX2V4dHIiICwgIm1zX3RvdCIgLCANCiAgICAgICAgICJlYmVfdG90IiwgImViZV9leHRyIiAgKSwNCiAgICAgICAgIGMoIlZCUF9neXAiLCAiVkJQX2V4dHIiLA0KICAgICAgICAgImNvZWZfQ0kiLCAiQ0lfZ3lwIiwgIkNJX2V4dHIiLA0KICAgICAgICAgIlZBX2d5cCIgLCAiVkFfZXh0ciIsICJLdmNfZXh0ciIgLCAiS3ZjX2d5cCIgLCANCiAgICAgICAgICJHX2d5cCIsICJHX2V4dHIiKSApDQoNClZCUGV4dFRjcCA9IGFzLmRhdGEudGFibGUoY3JpdGVyaW9fcHJvcGlvKQ0KY29scyA9IGMoImFuaW8iLCAidW5pZGFkIiwgImZ1ZW50ZSIsDQogICAgICAgICAidmJwX3RvdCIsDQogICAgICAgICAjICJ2YnBfZXh0ciIsDQogICAgICAgICAjICJjb2VmX2NpIiwNCiAgICAgICAgICJjaV90b3QiLCMgImNpX2V4dHIiLA0KICAgICAgICAgInZhX3RvdCIgLCANCiAgICAgICAgICMgInZhX2V4dHIiLCAibXNfZXh0ciIgLA0KICAgICAgICAgIm1zX3RvdCIgLCANCiAgICAgICAgICJlYmVfdG90Ig0KICAgICAgICAgIyAiZWJlX2V4dHIiICAgDQogICAgICAgICApDQpWQlBleHRUY3AgPSBWQlBleHRUY3BbLCBjb2xzLCB3aXRoPUZdDQpWQlBleHRUY3AgPSBWQlBleHRUY3BbY29tcGxldGUuY2FzZXMoVkJQZXh0VGNwKV0NCnNldG5hbWVzKFZCUGV4dFRjcCAsIA0KICAgICAgICAgYygidmJwX3RvdCIsICMgInZicF9leHRyIiwjICJjb2VmX2NpIiwNCiAgICAgICAgICJjaV90b3QiLCAjICJjaV9leHRyIiwNCiAgICAgICAgICJ2YV90b3QiICwgIyAidmFfZXh0ciIsICJtc19leHRyIiAsDQogICAgICAgICAibXNfdG90IiAsIA0KICAgICAgICAgImViZV90b3QiICAjICJlYmVfZXh0ciIgICksDQogICAgICAgICAgICksYygiVkJQX2d5cCIsICMgIlZCUF9leHRyIiwjICJjb2VmX0NJIiwgDQogICAgICAgICAiQ0lfZ3lwIiwgIyAiQ0lfZXh0ciIsDQogICAgICAgICAiVkFfZ3lwIiAsIyAiVkFfZXh0ciIsICJLdmNfZXh0ciIgLA0KICAgICAgICAgIkt2Y19neXAiICwgDQogICAgICAgICAiR19neXAiICAgIyAiR19leHRyIg0KICAgICAgICAgKSApDQoNCiMNClJUUEdfY29tcGFyYWNpb24gPSBhcy5kYXRhLnRhYmxlKHJlbnRhX2NvbXBhcmFjaW9uKSANClJUUEdfY29tcGFyYWNpb25bLCAiLi4uMSIgOj1OVUxMXQ0KUlRQR19jb21wYXJhY2lvbiA9IFJUUEdfY29tcGFyYWNpb25bdmFsb3IgIT0gMF0NCg0KIw0KY29zdG9zX2NvbXBhcmFjaW9uIDwtIHJlYWR4bDo6cmVhZF9leGNlbCgiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvY29zdG9zLnhsc3giKQ0KY29zdG9zX3BnX2NvbXBhcmFjaW9uID0gYXMuZGF0YS50YWJsZShjb3N0b3NfY29tcGFyYWNpb24pIA0Kc2V0bmFtZXMoY29zdG9zX3BnX2NvbXBhcmFjaW9uLCAiY29zdG8iLCAiUGNvc3QiKQ0KDQojDQojIGNvc3Rvc19wZ19jY25uPSBhcy5kYXRhLnRhYmxlIChjb3N0b3MgJT4lIGRpc3RpbmN0KCkpDQojIGNvc3Rvc19wZ19jY25uW2NvbXBsZXRlLmNhc2VzKGNvc3Rvc190b3RhbGVzKV0NCmBgYA0KDQpgYGB7cn0NCiANCiNjb25jYXRlbmFjaW9uIGRlIGFsbCBkYXRhDQphbGxfcmF3X2RhdGEgPSByYmluZGxpc3QobGlzdChwcm9kX21lcmdlX2NydWRvICxwcm9kX21lcmdlX2dhc19NTUJUVSwgDQogICAgICAgICAgICAgICBleHBvX3FfY3J1ZG8gLCBleHBvX3FfZ2FzX01NQlRVLA0KICAgICAgICAgICAgICAgcHJlY2lvX21pX2NydWRvLCBwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkLCANCiAgICAgICAgICAgICAgIHByZWNpb3NfcmVmZXJlbmNpYV9jcnVkbywgcHJlY2lvc19leHBvcnRhY2lvbl9jcnVkbywgDQogICAgICAgICAgICAgICBwcmVjaW9zX3JlZmVyZW5jaWFfZ2FzLCBwcmVjaW9zX2V4cG9ydGFjaW9uX2dhcywNCiAgICAgICAgICAgICAgIHJlZ2FsaWFzX3RvX3ZhcnMsIHJldGVuY2lvbmVzX3BnLCBzdWJzaWRpb3NfcGcpLCAgdXNlLm5hbWVzPVRSVUUpDQoNCg0KDQpgYGANCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KDQoNCmNvZWZpY2llbnRlcyA8LSBsaXN0KCJQcm9wb3JjacOzbiBkZSBsb3Mgc2VydmljaW9zIHNvYnJlIGV4dHJhY2Npb24iID0gc2VydmljaW9fc19leHRyYWNjaW9uLA0KICAgICAgICAgICAgICAgICAgICAgIlRhc2EgZGUgZGVwcmVjaWFjacOzbiBkZSBZUEYiID0gY29uc3Vtb19rX2Zpam9feXBmLA0KICAgICAgICAgICAgICAgICAgICAgIkltcHVlc3RvcyBwcm9tZWRpb3MgTUlQIDk3IiA9IGltcF9wcm9tXzk3LA0KICAgICAgICAgICAgICAgICAgICAgIkNvZWZpY2llbnRlIHRlY25pY28gTUlQIDk3IiA9IGNvZWZfdGVjbmljb185NywNCiAgICAgICAgICAgICAgICAgICAgICJQcm9wb3JjacOzbiBkZSBsYSBNYXNhIFNhbGFyaWFsIHRvdGFsIHByb21lZGlvIDIwMDQtMjAxMiI9IG1lYW5fY29lZl9tcyRjb2VmX21zX3RvdCwNCiAgICAgICAgICAgICAgICAgICAgICJQcm9wb3JjacOzbiBkZSBsYSBNYXNhIFNhbGFyaWFsIGV4dHJhY2Npb24gcHJvbWVkaW8gMjAwNC0yMDEyIj0gbWVhbl9jb2VmX21zJGNvZWZfbXNfZXh0ciwNCiAgICAgICAgICAgICAgICAgICAgICJDb2VmaWNpZW50ZSBjb25zdW1vIGludGVybWVkaW8gKEHDsW8pIiA9Y29lZl9jb25zdW1vX2ludGVybWVkaW8kYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICJDb2VmaWNpZW50ZSBjb25zdW1vIGludGVybWVkaW8gKDEtIFZBL1ZCUCkiID1jb2VmX2NvbnN1bW9faW50ZXJtZWRpbyRjb2VmX2NpKQ0KY2FwdHVyZS5vdXRwdXQoY29lZmljaWVudGVzLCBmaWxlID0gIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL2NvZWZpY2llbnRlcy50eHQiKQ0KDQppbmRpY2UgPC0gIHJlYWRfZXhjZWwoIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL21ldGFkYXRhX2FyZy54bHN4Iiwgc2hlZXQgPSAiaW5kaWNlIikNCnZhcmlhYmxlcyA8LSAgcmVhZF9leGNlbCgiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvbWV0YWRhdGFfYXJnLnhsc3giLCBzaGVldCA9ICJ2YXJpYWJsZXMiKQ0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KGluZGljZSA9IGluZGljZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM9IHZhcmlhYmxlcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgdGlwb19jYW1iaW8gPSB0Y3BfYW51YWxfYiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBpcGMgPSBpcGNfcHJvbWVkaW8gLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHB2X3lfcGJpID0gZ2FuYW5jaWFfeV9wYmkgLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19kYXRhID0gYWxsX3Jhd19kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICBSVFBHX21lY2FuaXNtb3MgPSByZW50YV9pbmRpcmVjdG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgUlRQR19QZXh0USA9IHJlbnRhX2RpcmVjdG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgUlRQR19tZWNhbmlzbW9zX3ZzX3BpYiA9IHJlbnRhX2luZGlyZWN0b19wYmksDQogICAgICAgICAgICAgICAgICAgICAgICAgUlRQR19QZXh0UV92c19waWIgPSByZW50YV9kaXJlY3RvX3BiaSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkb19kaWZfcHJlX3lfc3YgPSBjcnVkb19kaWZfcHJlY2lvcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FzX2RpZl9wcmVfeV9zdiA9IGdhc19kaWZfcHJlY2lvcywNCiAgICAgICAgICAgICAgICAgICAgICAgICByZWdfcmV0X3N1YnMgPSByZWdfcmV0X3N1YnMsDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICB0Z19wZ190b3RhbCA9dGdfcGdfdG90YWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgIyB0Z19wZ19lbXByZXNhcyA9IHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RvY2tfcGdfYmFsYW5jZXMgPSBzdG9ja19iYWxhbmNlc19lbXByZXNhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlZ21lbnRvX1lQRl9QZXRCUiA9dW5pb25fc2VnbWVudG9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNjbm5fcGcgPSBjY25uX3BnLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvX2Njbm5fcGc9Y3JpdGVyaW9fY2Nubl9wZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgZW1wYWxtZV9jY25uX3BnPWVtcGFsbWVfY2Nubl9wZywNCiAgICAgICAgICAgICAgICAgICAgICAgICBWQlBleHRUY3AgID1jcml0ZXJpb19wcm9waW8gLA0KICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgIFJUUEdfY29tcGFyYWNpb24gPSBSVFBHX2NvbXBhcmFjaW9uICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgY29zdG9zX3BnX2NvbXBhcmFjaW9uID0gY29zdG9zX2NvbXBhcmFjaW9uIA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBjb3N0b3NfcGdfY2Nubj1jb3N0b3MgJT4lIGZpbHRlcihhbmlvID4xOTkzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICIuLi9yZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9kZV9sYV90aWVycmFfaGlkcm9jYXJidXJpZmVyYV9hcmcueGxzeCIpDQoNCg0KcHJpbnQoIkVsIGPDs2RpZ28gdGVybWluw7MgZGUgY29ycmVyIikNCmBgYA0KDQoNCg0KDQoNCg0KDQo=